我有一个字符串:
aaabbashasccddee
Run Code Online (Sandbox Code Playgroud)
我想获得偶数个连续相同字符的匹配项。例如,从上面的字符串中,我想要这些匹配项:
[bb],[cc],[dd],[ee]
Run Code Online (Sandbox Code Playgroud)
我已经尝试过此解决方案,但还没有结束:
"^(..)*$
Run Code Online (Sandbox Code Playgroud)
任何帮助请
幸运的是,.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)