正则表达式中的+(?!\d)是什么意思?

5
我也见过它被表示为+$。
我正在使用。
$(this).text( $(this).text().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") );

将10000转换为10,000等。

我认为我理解其他所有内容:

  • (\d) - 查找数字
  • (?=\d{3}) - 如果后面跟着3个数字
  • '+' - 不要在第一次查找后停止
  • (?!\d) - 从最后一个数字开始?
  • /g - 对整个字符串进行操作
  • ,"$1," - 用自身和逗号替换数字

3
@SeanKenny 你能解释一下这个正则表达式吗?我不太理解它,但我正在使用它。 - Engineer
1
@SeanKenny 因为我知道它是什么并且有效,而且至少我正在尝试通过在这里提问来完全理解它,我本来不需要这样做! - seanjacob
1
我的意思是你不知道它的作用是如何编写正则表达式的,但现在这似乎是一个愚蠢的问题了。 - user1486147
2个回答

7
我认为你有些误解:
  • (?=\d{3}) - 如果后面跟着3个数字
请注意,正则表达式实际上是:
(?=(\d{3})+

即你错过了一个开括号。以下是整个内容:
(\d{3})+(?!\d)

(?= ... )在这里是一个零宽先行断言,意思是括号内的内容应该跟我们已经匹配到的内容后面,但实际上不会消耗掉它。

(?!\d)表示数字\d不应该出现在后面,所以总体来说:

  • (\d)查找并捕获数字。
  • (?=(\d{3})+(?!\d))断言应该有一个或多个由三个数字组成的组跟随其后,但它们后面不应该再有另一个数字。

我们用"$1,"替换,也就是第一个捕获的数字和一个逗号。

因此,我们在具有三位数倍数的数字后面添加逗号,这是一种很好的方式,可以将逗号作为千位分隔符!


1

?! 表示 负向先行断言,它用于匹配后面不跟随某些内容的情况,例如在你的情况下是一个数字


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