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

本文关键字:单词 保留 字符 字符串 串并 | 更新日期: 2023-09-27 18:31:36

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

你好和世界或白狐狸

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

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"。使用此算法,输出为"狐狸"白色或世界和你好"。有没有办法保留"白狐狸"的顺序,这样我就会得到"白狐狸"或世界和你好"之类的东西?

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

这样的事情会起作用:

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 字符: ''w 了解单词字符的精确定义。

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