我正在尝试反转字符串中的单词,但保留引号中的单词的顺序。例如,假设我有这个字符串:
你好,世界还是白狐?
这就是我通常会如何做到这一点:
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'这样的东西?
答案 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