gpt4 book ai didi

regex - 向数字添加逗号时需要环视解释

转载 作者:行者123 更新时间:2023-12-01 07:31:25 26 4
gpt4 key购买 nike

我很乐意帮助您理解下面代码中发生的事情。它只是没有点击。所以,这个片段(取自这个 book )

s/(?<=\d)(?=(\d\d\d)+$)/,/g

将数字 123456789 转换为 123,456,789。 ( g 是全局标志)。现在,假设我们有数字 1234。根据我的理解,(?<=\d) 会将我们放在 1 前面,例如 1|234。然后,(?=(\d\d\d)+$) 从 look behind 停止的地方开始并评估剩余的数字。由于 234 匹配模式(3 位数字和一个结束行),我们的替换发生了 (1,234)。我希望我做对了。

现在,当我把我的数字变大,比如 1234567 时,我感到很困惑。当我把它放入正则表达式测试器时,我得到 1|234|567,但在我看来我期望 1234|567。所以为什么 ?当 4 没有被结束线终止时,为什么 234 的前瞻评估为真?这与全局标志有什么关系吗?谢谢。

最佳答案

前瞻查找三位数字的倍数:(\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.

关于regex - 向数字添加逗号时需要环视解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21975207/

26 4 0
文章推荐: jquery - MVC 工具更新后 ASP.NET MVC 3 + jQuery 无法工作?
文章推荐: ocaml - OCaml 中 `ignore` 函数的真正目的是什么?
文章推荐: jquery - 单击时获取 keyCode?
文章推荐: java - 将 List 传递给需要 List 的方法