反转字符串并保留引号中的单词

时间:2013-09-17 22:54:16

标签: c# string

我正在尝试反转字符串中的单词,但保留引号中的单词的顺序。例如,假设我有这个字符串:

  

你好,世界还是白狐?

这就是我通常会如何做到这一点:

string source = "hello and world or white fox";

string[] words = source.Split(' ');

words = words.Reverse().ToArray();

string newSource = string.Join(" ", words);

会导致这个:

  

狐狸白或世界和你好

现在假设我将来源更改为'hello and world或“white fox”'。使用此算法,输出为'fox“”white或world和hello'。有没有办法保留'white fox'的顺序,以便我得到像'“white fox”或者world和hello'这样的东西?

2 个答案:

答案 0 :(得分:3)

这样的事情会起作用:

string newSource = String.Join(" ", 
    Regex.Matches(source, @"\w+|""[\w\s]+""").Cast<Match>().Reverse());

这将找到由字母,数字或下划线组成的任何单个“单词”,或由引号括起的单词和空白字符的复合,然后反转匹配并加入结果。

结果将是这样的:

  • "hello and world or white fox" =&gt; "fox white or world and hello"
  • "hello and world or \"white fox\"" =&gt; "\"white fox\" or world and hello"

不幸的是,这会完全忽略任何非单词字符(例如"foo - bar" =&gt; "bar foo"),但可以修改模式以考虑其他字符。

注意:有关单词字符的准确定义,请参阅MSDN Word Character: \w

答案 1 :(得分:1)

此模式仅匹配引号(\s)(?=(?:(?:[^"]*"[^"]*){2})*$)|\s(?!.*")之外的空格 demo