我研究、测试并使用了 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