代码之家  ›  专栏  ›  技术社区  ›  softshipper

正则表达式以任意数字开头,结尾不应为零

  •  0
  • softshipper  · 技术社区  · 5 年前

    我正在尝试创建一个Regex,其中包含应该分组的组 1234.0500- 1234.05- . 我试过的是:

    ^([0-9]+)(\.)([1-9]*)0*(-?)$
    

    但不匹配 . 下面是一个例子 https://regex101.com/r/koSZoB/1

    1234.0000
    0.9000
    

    1234
    0.9
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   The fourth bird    5 年前

    按照你的模式,这部分 ([1-9]*)0*(-?)$ 匹配可选的数字1-9,后跟可选的零,然后在字符串末尾匹配可选的连字符。它将成功到第一个零:

    0500
    ^
    

    (-?)$


    在第1组之后,您可以匹配一个点,后跟应该删除的零,或者在第2组中捕获从点到lats数字1-9的匹配,并删除后面的零。

    ^(\d+)(?:\.0+|(\.\d*[1-9])0+)(-?)$
    

    解释

    • ^ 字符串开头
    • (\d+)
    • (?:
      • \.0+ 匹配a . 和1+0
      • |
      • (\.\d*[1-9])0+ 捕获 . ,0+位后跟数字1-9,并匹配要删除的1+零
    • ) 关闭组
    • (-?) 捕获可选 -
    • $

    Regex demo

    const pattern = /^(\d+)(?:\.0+|(\.\d*[1-9])0+)(-?)$/;
    [
      "1234.0500-",
      "1234.05500-",
      "1234.0550588500-",
      "1234.0000",
      "0.9000",
      "12.1222",
      "12.1222-",
    ].forEach(s => console.log(s.replace(pattern, "$1$2$3")));
        2
  •  0
  •   Exelian    5 年前

    第三个捕获组不包含零,这意味着0在 05

    我建议通过添加一个 ? ^([0-9]+)(\.)([0-9]*?)0*(-?)$ 这将使它匹配尽可能少的零,而不是最大值。最后一组人很贪婪,这应该管用。