0

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

你好,世界或白狐

这就是我通常会如何实现这一目标:

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 or world and hello'。有没有办法保留“白狐”的顺序,这样我就会得到“白狐”或世界和你好之类的东西?

4

2 回答 2

3

像这样的东西会起作用:

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

这将找到由字母、数字或下划线组成的任何单个“单词”,或者由引号包围的单词和空格字符的组合,然后反转匹配项并连接结果。

结果将是这样的:

  • "hello and world or white fox"=> "fox white or world and hello"
  • "hello and world or \"white fox\""=> "\"white fox\" or world and hello"

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

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

于 2013-09-17T23:03:12.830 回答
1

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

于 2013-09-17T23:12:03.883 回答