c# - 正则表达式未找到所有匹配项 C#

标签 c# regex

<分区>

我研究、测试并使用了 RegEx.101,但无法解决这个问题。我花了好几个小时。

我正在寻找 16 数字

这是我的正则表达式:"[0-9]{16}"

代码如下:

Regex ItemRegex = new Regex("[0-9]{16}");
// test with a 29 digit number
foreach (Match ItemMatch in ItemRegex.Matches("564654564553314342340968580654"))
{
    i++;
}

我期待多场比赛,但我只得到前 16 位数字。如何获取从位置 1 开始的前 16 位数字,然后是从位置 2 开始的第二个 16 位数字,然后是第三位,依此类推?

任何想法、想法、建议或解决方案都将不胜感激并 +1。

最佳答案

正如 ctwheels 在他/她的评论中提到的那样,要获得所需的重叠匹配,您需要使用一个称为 lookahead assertion 的概念,它是一个表达式,可以在不消耗这些字符的情况下评估条件是否满足。这些分别称为正面和负面前瞻断言。考虑以下表达式:

\d(?=(\d{15}))

第一个 \d 将匹配单个数字并在表达式中使用该字符。这之后是一个肯定的先行断言(由 (?=expression) 表示),它测试该单个数字后面是否跟有另外 15 个数字,而不消耗这 15 个字符。不使用这些字符意味着表达式可以找到从与初始 \d 匹配的字符 之后 的第一个字符开始的其他匹配项。所以:

var expression = @"\d(?=(\d{15}))";
var testString = "564654564553314342340968580654";

var regex = new Regex(expression);
foreach (Match match in regex.Matches(testString))
{
    Console.WriteLine($"{match.Groups[0].Value}{match.Groups[1].Value}");
}

在我的 Console.WriteLine 中,我聚合了将出现在每场比赛中的两组内容:第一个是前导数字,第二个是它后面的 15 位数字组。上面代码的输出是:

5646545645533143
6465456455331434
4654564553314342
6545645533143423
5456455331434234
4564553314342340
5645533143423409
6455331434234096
4553314342340968
5533143423409685
5331434234096858
3314342340968580
3143423409685806
1434234096858065
4342340968580654

关于c# - 正则表达式未找到所有匹配项 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49516026/

相关文章:

c# - 编译器以什么顺序搜索命名空间/二进制文件以查找变量名?

c# - 无法使用动态 C# 转换通用基元

c# - 在c#中转换xml文件中的excel文件

java - 我可以将 'UNICODE_CHARACTER_CLASS' 设置为所有模式用法吗?

regex - PowerShell 正则表达式分组

c# - 如何使用 XAML 中的资源初始化只读项集合

c# - XDocument.Save 到特定目录?

c# - 正则表达式:匹配 JavaScript 源代码中的 'in' 运算符

php - 替换 MySQL 的 URL 模式

java - 使用正则表达式仅允许左对齐零