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
相关产品推荐
相关产品推荐

