我很乐意在理解下面代码中发生的事情时给予一些帮助。它只是没有点击。所以,代码片段(取自此book)
s/(?<=\d)(?=(\d\d\d)+$)/,/g
将数字123456789转换为123,456,789。 (g
是全局标志)。现在,假设我们有1234号码。根据我的理解(?<=\d)
将我们放在1前面,如此1 | 234。然后,(?=(\d\d\d)+$)
选择后面的外观,并评估剩余的数字。由于234匹配模式(3位数和1位终止线),我们的替换发生(1,234)。我希望我做对了。
现在,当我把我的数字变得更大时,我很困惑说1234567.当我把它放到一个正则表达式测试器中时,我得到1 | 234 | 567但是在我看来我期望1234 | 567。所以为什么 ?当4未被终止线终止时,为什么234的前瞻评估为真?这与全球旗帜有什么关系吗?谢谢。
答案 0 :(得分:3)
前瞻查找三位数的倍数:(\d\d\d)+
匹配3个,6个,9个......数字,因此它在234567
之前匹配。
是的,全局标志与正则表达式匹配两次有关(尽管没有它,因为你可以很容易地测试,结果将是1|234567
)。
让我们看看当我们浏览字符串"1234567"
时会发生什么:
1. 1234567
^ (?<=\d) doesn't match - regex fails.
2. 1 234567
^ (?<=\d) matches "1", (?=(\d\d\d)+$) matches "234567"! MATCH!
3. 12 34567
^ (?<=\d) matches "2", (?=(\d\d\d)+$) doesn't match.
4. 123 4567
^ (?<=\d) matches "3", (?=(\d\d\d)+$) doesn't match.
5. 1234 567
^ (?<=\d) matches "4", (?=(\d\d\d)+$) matches "567"! MATCH!
6. 12345 67
^ (?<=\d) matches "5", (?=(\d\d\d)+$) doesn't match.
7. 123456 7
^ (?<=\d) matches "6", (?=(\d\d\d)+$) doesn't match.
8. 1234567
^ (?<=\d) matches "7", (?=(\d\d\d)+$) doesn't match.