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

C# Regex.Matches如何从匹配组第二个字符开始下一次匹配

实现C#中从匹配组第二个字符开始的Regex匹配

我明白你想要的效果——默认的Regex.Matches会从上次匹配结束的位置开始找下一个结果,但你希望每次匹配后,下一次的起始点是上一个匹配组的第二个字符,也就是实现重叠匹配的效果对吧?比如输入12345678时,默认只能拿到1234和5678,但你想得到1234、2345、3456、4567、5678这些重叠的结果。下面给你两种可行的实现方式:

方法一:使用零宽度正向预查(正则内置方式)

零宽度正向预查(?=...)的特点是只匹配位置,不消耗字符,所以每次匹配后,正则引擎会自动从当前位置的下一个字符继续查找,正好符合你的需求。我们只需要把目标匹配规则放在预查的捕获组里,之后提取捕获组的内容即可。

示例代码:

string input = "12345678";
// 用(?=(\d{4}))预查后面的4个数字,并捕获到组1中
Regex regex = new Regex(@"(?=(\d{4}))");

// 过滤空结果并提取捕获组的值
var matches = regex.Matches(input)
                   .Cast<Match>()
                   .Where(m => !string.IsNullOrEmpty(m.Groups[1].Value))
                   .Select(m => m.Groups[1].Value)
                   .ToList();

// 输出结果:1234、2345、3456、4567、5678
foreach (var match in matches)
{
    Console.WriteLine(match);
}

这种方法代码简洁,适合简单的匹配规则;如果你的正则逻辑比较复杂,只需要把核心匹配规则放到(?=(...))的括号里即可。

方法二:手动控制匹配起始位置(灵活可控方式)

如果觉得正则预查不好理解,或者需要更灵活的控制逻辑,可以手动循环调用Regex.Match方法,每次匹配成功后,将下一次的起始位置设置为当前匹配的索引+1,这样就实现了从上次匹配组的第二个字符开始查找的效果。

示例代码:

string input = "12345678";
Regex regex = new Regex(@"\d{4}");
List<string> matches = new List<string>();
int startIndex = 0;

// 循环匹配直到没有足够字符或匹配失败
while (startIndex <= input.Length - regex.Match(input, startIndex).Length)
{
    Match match = regex.Match(input, startIndex);
    if (match.Success)
    {
        matches.Add(match.Value);
        // 下一次从当前匹配的第二个字符开始
        startIndex = match.Index + 1;
    }
    else
    {
        break;
    }
}

// 输出结果:1234、2345、3456、4567、5678
foreach (var match in matches)
{
    Console.WriteLine(match);
}

这种方法的优势是逻辑直观,调试起来更方便,如果你需要在匹配过程中加入额外的判断逻辑(比如过滤某些特定结果),这种方式会更灵活。

内容的提问来源于stack exchange,提问作者AnujGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:01:26