You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:45:00