用于不带结束字符的数字的正则表达式



我需要正则表达式,可以是负数,带逗号或小数。

示例: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)-如果当前位置的右边有一个数字,则会导致匹配失败。

最新更新