我研究,测试并使用了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' d。
答案 0 :(得分:4)
正如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
答案 1 :(得分:2)
(?=(\d{16}))
(?=(\d{16}))
正向前瞻确保以下跟随当前位置
(\d{16})
将16位数字捕获到捕获组1 结果:
5646545645533143
6465456455331434
4654564553314342
6545645533143423
5456455331434234
4564553314342340
5645533143423409
6455331434234096
4553314342340968
5533143423409685
5331434234096858
3314342340968580
3143423409685806
1434234096858065
4342340968580654
那么这是如何工作的?好吧,前瞻(?=)
是一个零宽度断言,用于检查它包含的子模式是否与字符串中的特定位置匹配。由于我们尚未锚定我们的正则表达式,因此会尝试匹配字符串中的每个位置。
那么零宽度断言意味着什么呢?外观实际上匹配字符,然后放弃匹配,仅返回结果:匹配或不匹配。在我们的例子中,我们还在正向前瞻断言中添加了一个捕获组,从而允许它捕获结果。我们最终得到的是空匹配(仅在跟随16位数的特定位置匹配)和捕获组中的结果(我们的16位数)。
答案 2 :(得分:1)