正则表达式数字表达式

regex number expression

经过多年从 SO 社区吸取知识后,我在这里提出我的第一个问题。

我正在尝试为 JavaScript 网络项目创建正则表达式,以在给定字符串中查找带有千位分隔符的整数(正数或负数),或仅查找整数。

一些有效的例子:

561,085 
3,894,320 
-59,099 
1,000 
1000 
-1000 
1 
-1 
0 

无效示例:

-01
01393
01,300,00
-04,044

到目前为止我已经创建了这个表达式:

\b(?:[0])|(?:(((-)?[1-9]?\d{2}|\d)((,)?\d{3})|((-)?[1-9]+\d*)))\b

(?:[0]) - 匹配前导 0

|(?:(((-)?[1-9?\d{2}|\d)((,)?\d{3}) - 或匹配 1-9 起始数字

之后的逗号和 3 位数字

|((-)?[1-9]+\d*))) - 或者只匹配整个 1-9 起始数字,不带任何逗号

我认为它在所有情况下都有效,除了当我测试一个带有 5 位数字尾随减号的字符串时,例如像这样:
值:-01110

在本例中,它接受 01110 作为匹配项。

谁能帮我弄清楚我的表达有什么问题?
也不会介意一些关于我如何在这里提出问题樱桃的一般性 pointers/feedback,干杯!

你可以使用

^(?:0|-?[1-9]\d*|-?[1-9]\d{0,2}(?:,\d{3})+)$

参见 a demo on regex101.com


这意味着:

^                             # start of the string
(?:                           # open par
    0                         # zero
    |                         # or
    -?[1-9]\d*                # -100 or 234 or -121323232
    |                         # or
    -?[1-9]\d{0,2}(?:,\d{3})+ # separated by comma
)                             # close par
$                             # end of the string

要真正“在野外”使用它(即在任何给定的文本中),您需要调整锚点以适应环顾四周:

(?<=^|\s)(?:0|-?[1-9]\d*|-?[1-9]\d{0,2}(?:,\d{3})+)(?=\s|$)
# ^^1^^                                              ^^2^^

^^1^^ 表示“字符串的开头或表达式前面的一些空格”,^^2^^ 表示“表达式后面的一些空格或字符串的结尾”。

再看一个demo on regex101.com