关于这个正则表达式(?< = \ d)\ d {4}

时间:2014-02-21 04:26:37

标签: regex

我使用(?<=\d)\d{4}来匹配1234567890,结果为2345 6789。 为什么不是2345 7890

在第二场比赛中,它从6开始,6与(?<=\d)匹配,所以我认为结果是7890而不是6789

此外,如何使用((?<=\d)\d{3})+匹配1234567890

4 个答案:

答案 0 :(得分:3)

看后面是非消费的,所以5在第二场比赛中被“重复使用”(即使第一场比赛消耗了它)。

如果您想从6开始,请使用但不要捕获:

\d(\d{4})

使用第1组,或者如果你的正则表达式引擎支持它,请使用\G后面的负面外观,这是上一场比赛的结束:

(?!\G)(?<=\d)\d{4}

查看live demo

答案 1 :(得分:0)

(?<=\d)零长度断言,断言消耗字符串中的字符,但只断言是否可以匹配。

答案 2 :(得分:0)

匹配方式与第一场比赛在5结束时匹配,因此下一组可以从6匹配。(?<=\d)在这种情况下匹配5,匹配在6789,从6开始。

(?<=\d)不属于该匹配,它不消耗一个字符,它只是断言匹配前的内容。

答案 3 :(得分:0)

(?<=\d)\d{4}

?<= Lookbehind.确保数字位于要匹配的文字之前。

我们匹配哪些文字? d{4}因此,含义与那些前面有一位数的4位数相匹配。

1234567890中这样的匹配为2345,因为它前面有1现在我们有一个匹配项,匹配的字符串仍然是1234567890现在检查正则表达式条件将再次告诉找到具有前缀作为数字的四位数组。由于2345已匹配,因此下一次成功匹配为6789,前面有5,符合正则表达式条件。

(?<=\d)\d{3}它会像之前一样只做一组3.编辑这个正则表达式以获得你提到的那个,我们在捕获组中添加整个东西。 ((?<=\d)\d{3})并说one or more of this ((?<=\d)\d{3})+。重复捕获组只捕获最后一次迭代。

因此890作为匹配返回。