我有这个字符串:
com.example.is-this@myname
我希望它是
myname@this-is.example.com
使用.Net,但直接的概念或想法会很好。
我目前正在做的是遍历每个角色,找出它是否是“特殊字符”之一,并将所有先前的字符分配给数组的变量,最后,我将它们连接在一起从最后到第一。
是否有更有效的方法可以做到这一点?
答案 0 :(得分:9)
这是经典的逐字反转,在分隔符上有一点点扭曲。这个问题的解决方案是单独反转每个单词,然后反转整个字符串。在翻转单词时不要触摸分隔符。
第一步如下:我们找到每个令牌的限制,并将其反转到位,如下所示:
反转结果以获得所需的输出:
moc.elpmaxe.si-siht@emanym -> myname@this-is.example.com
就实现而言,您可以通过将字符串转换为字符数组以使其在适当位置更改来执行此操作,并编写一个简短的辅助方法,使您可以反转char
数组的一部分在索引i
和j
之间。有了这个辅助方法,你需要做的就是找到分隔符并为每个分隔的单词调用帮助器,然后进行最后一次调用以反转整个句子。
答案 1 :(得分:1)
您可以使用Split
C#方法。
以下示例来自here。
using System;
class Program
{
static void Main()
{
string s = "there is a cat";
// Split string on spaces.
// ... This will separate all the words.
string[] words = s.Split(' ');
foreach (string word in words)
{
Console.WriteLine(word);
}
}
}
就像例子一样简单。
然后您为Split()
string [] split = strings .Split(new Char [] {'.' , '@', '-' },
StringSplitOptions.RemoveEmptyEntries);
RemoveEmptyEntries
只会删除数组中不需要的空条目。
之后,您使用Array.Reverse
method转换数组。
然后你可以用Foreach循环将你的弦拼接回来。
作为评论中提到的@marjan-venema,您可以在此处使用每个分隔符填充并行数组。反转它,然后在每个条目使用Foreach循环时连接字符串。
答案 2 :(得分:0)
以下是另一种使用List
的方法,它有一个方便的Insert
方法,以及Reverse
方法。
Insert
方法允许您继续将字符添加到列表中的相同索引(以及将其移动到更高索引之后的其他索引)。
因此,当您阅读原始字符串时,您可以在开头继续插入字符。一旦你来到一个分界仪,你将它添加到末尾并调整你的插入位置就在分隔符后面。
完成后,您只需拨打Reverse
并将字符加回字符串:
public static string ReverseWords(string words, char[] wordDelimeters)
{
var reversed = new List<char>();
int insertPosition = 0;
for(int i = 0; i < words.Length; i++)
{
var character = words[i];
if (wordDelimeters.Contains(character))
{
reversed.Add(character);
insertPosition = i + 1;
continue;
}
reversed.Insert(insertPosition, character);
}
reversed.Reverse();
return string.Join("", reversed);
}