为什么这个正则表达式无法匹配第二个6位数字?

3
我不明白为什么下面的PowerShell代码无法运行:
([regex]"(^|\D)(\d{6})(\D|$)").Matches( "123456 123457" ).Value

上面的代码会生成:
123456

为什么它不能匹配两个数字?

我的回答对你有帮助吗? - Wiktor Stribiżew
1个回答

6
"(?<=\D)(\d{6})(?=\D)"正则表达式匹配且不消耗6个数字前后的非数字字符(即在第一次迭代期间,123456后面的空格未被消耗)。
使用一个非消耗构造,向前查找和向后查找:
"(?<!\d)\d{6}(?!\d)"

请查看.NET正则表达式演示

(?<!\d) 负向零宽断言用于判定当前位置左侧是否有数字,如果有数字则匹配失败。(?!\d) 负向零宽断言用于判定当前位置右侧是否有数字,不会改变正则表达式在字符串中的索引位置。


所以,如果我理解正确的话,你的意思是,如果不使用lookbehind或lookahead,第二个匹配的起始点是第一个匹配结束后的第一个字符。在我的例子中,我的正则表达式匹配了第一个匹配的空格,因此第二个正则表达式从1开始。 - Bruno
是的,在“123457”单词中,第二个匹配项从“1”开始搜索。 - Wiktor Stribiżew
PS 代码片段:$string -match '(?<!\d)\d{6}(?!\d)' | Out-Null,然后使用 $matches[0] 访问匹配值。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接