C#中Regex无法匹配全部16位数字问题求助
解决正则匹配连续重叠16位数字的问题
这问题我之前也踩过坑!你现在用的[0-9]{16}正则是非重叠匹配——当它匹配到前16位数字后,会直接跳过这16个字符,从第17位开始找下一个匹配,自然拿不到你想要的连续重叠结果(比如第1-16位、第2-17位、第3-18位...)。
解决方案:用正向预查实现重叠匹配
要获取所有连续的16位数字,你需要用正向预查(Positive Lookahead),它的特点是只检查当前位置后面是否符合规则,不会“消耗”匹配到的字符,这样正则引擎就能逐个字符往后检查,得到所有重叠的结果。
修改后的正则表达式是:(?=(\d{16}))
对应的C#代码示例
Regex ItemRegex = new Regex(@"(?=(\d{16}))"); string input = "564654564553314342340968580654"; int matchCount = 0; foreach (Match itemMatch in ItemRegex.Matches(input)) { // 匹配结果存在捕获组1中 string matchedValue = itemMatch.Groups[1].Value; if (!string.IsNullOrEmpty(matchedValue)) { Console.WriteLine(matchedValue); matchCount++; } } Console.WriteLine($"总共匹配到 {matchCount} 个连续的16位数字");
原理说明
- 正向预查
(?=...)只是做一个“存在性检查”:确认当前位置后面有16位数字,但不会把这16位数字从输入字符串中移除。 - 每次检查完成后,正则引擎会移动一个字符的位置,继续检查下一个位置后面是否有16位数字,这样就能得到所有从第1位开始、第2位开始...的连续16位数字组合。
- 原来的
[0-9]{16}会直接“吃掉”16个字符,导致下一次匹配从第17位开始,所以只能拿到非重叠的结果。
内容的提问来源于stack exchange,提问作者Missy
相关产品推荐
相关产品推荐

