如何匹配字符串中任何字符的偶数?

Ale*_*lex 2 c# regex

我有一个字符串:

aaabbashasccddee
Run Code Online (Sandbox Code Playgroud)

我想获得偶数个连续相同字符的匹配项。例如,从上面的字符串中,我想要这些匹配项:

[bb],[cc],[dd],[ee]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过此解决方案,但还没有结束:

"^(..)*$
Run Code Online (Sandbox Code Playgroud)

任何帮助请

rev*_*evo 5

幸运的是,.NET正则表达式能够处理无限的回顾。您可以使用以下正则表达式来实现所需的功能:

((?>(?(2)(?=\2))(.)\2)+)(?<!\2\1)(?!\2)
Run Code Online (Sandbox Code Playgroud)

在这里观看现场演示

正则表达式细分:

  • ( 开始捕获第1组
    • (?> 非捕获组的开始(原子)
      • (?(2) 如果设置了捕获组#2
        • (?=\2) 下一个字符应该是
      • ) 以条件结束
      • (.)\2 匹配并捕获字符并再次匹配(偶数)
    • )+ 尽可能重复一次,至少一次
  • ) #1捕获结束
  • (?<!\2\1)这是窍门。后向告诉引擎,比我们到目前为止匹配的字符早的前一个字符不应与存储在捕获组#2中的字符相同
  • (?!\2) 下一个字符不应与捕获组#2中存储的字符相同

更新:

因此,您可以在C#中执行以下代码,以通过字符串获取所有偶数序列char,Regex而无需任何其他运算符(纯正则表达式)。

var allEvenSequences = Regex.Matches("aaabbashasccddee", @"((?>(?(2)(?=\2))(.)\2)+)(?<!\2\1)(?!\2)").Cast<Match>().ToList();
Run Code Online (Sandbox Code Playgroud)

另外,如果要制作,[bb],[cc],[dd],[ee]则可以加入该序列数组:

string strEvenSequences = string.Join(",", allEvenSequence.Select(x => $"[{x}]").ToArray());
//strEvenSequences will be [bb],[cc],[dd],[ee]
Run Code Online (Sandbox Code Playgroud)