如何让C# Regex.Matches返回所有有效正则匹配结果?
问题
我需要在字符串中查找所有
_X_的出现(其中X为任意大写英文字母A-Z)。示例字符串为"A_B_C_D",期望匹配结果为_A_、_B_、_C_、_D_。使用C#代码:var input = "_A_B_C_D_"; var pattern = "_[A-Z]_"; var matches = Regex.Matches(input, pattern);得到的结果仅为
_A_和_C_,显然当前模式有误,请问正确的正则模式是什么?
原因分析
原来的正则_[A-Z]_会消耗匹配到的字符:当它匹配到_A_后,下一次匹配的起始位置会跳到_A_的末尾(也就是A后面的_之后),这样就错过了_B_的前导_,只能匹配到_C_,以此类推,最终只能拿到奇数位置的匹配项。
解决方案
使用正向预查(零宽度断言),它不会消耗字符,匹配后指针不会移动,能实现重叠内容的连续匹配。
正确的正则模式是(?=(_[A-Z]_)),对应的C#代码如下:
var input = "_A_B_C_D_"; var pattern = @"(?=(_[A-Z]_))"; var matches = Regex.Matches(input, pattern); // 提取捕获组中的目标内容 var resultList = matches.Cast<Match>() .Select(match => match.Groups[1].Value) .ToList(); // 输出结果:_A_、_B_、_C_、_D_
模式说明
(?=...):正向预查,仅验证当前位置后方是否符合括号内的规则,不会移动匹配指针(_[A-Z]_):捕获组,用来提取我们实际需要的_X_格式内容
这样每次匹配后,指针停留在当前位置的下一个字符,就能依次检测到所有重叠的_X_项。
更新:经验证,该模式确实可以得到期望的全部匹配结果。
内容的提问来源于stack exchange,提问作者Clueless.PS1
相关产品推荐
相关产品推荐

