我需要正则表达式,可以是负数,带逗号或小数。
示例:12 +12 -12.0 -12,345.5466 +12,345,678,678 0.154
But not pass: "500."或"500"。我希望500将作为一个数字返回,不带点或逗号连接到数字。
我写的正则表达式是:
[-+]?((0|([1-9](d*|d{0,2}(,d{3})*)))(.d*[0-9])?)(?!S)
它可以在正确的数字上工作(如示例),但它不适用于'500 '或'500 '。
假设您想在500.
和500,
中匹配500
,您应该记住(?!S)
需要在右侧立即使用空格或字符串结束符。
你可以用
解决这个问题[-+]?(?:0|[1-9](?:d{0,2}(?:,d{3})*|d*))(?:.d+)?(?!d)
请参阅这个regex演示,并注意可以根据需要排除的上下文进一步增强。
我在末尾用(?!d)
替换了(?!S)
,如果右边有一个数字,而不是任何非空白字符,则匹配失败。
还请注意,我删除了不必要的组,并将所有捕获组转换为非捕获组。
另外,请注意(?:,d{3})*|d*)
组,我交换了备选项,因为第一个更具体,应该先执行。
细节
[-+]?
-可选-
或+
(?:0|[1-9](?:d{0,2}(?:,d{3})*|d*))
-0
或[1-9]
-非零数字(?:d{0,2}(?:,d{3})*|d*)
-任选其一d{0,2}(?:,d{3})*
-零,一个或两个数字,然后零次或多次出现逗号和三位数字|
-或d*
- 0或多个数字
(?:.d+)?
-.
和一个或多个数字的可选序列(?!d)
-如果当前位置的右边有一个数字,则会导致匹配失败。