【问题标题】:Regex greater than zero with 2 decimal places正则表达式大于零,小数点后 2 位
【发布时间】:2011-12-22 21:05:48
【问题描述】:

我需要一个正则表达式来表示最多两位小数大于零的数值,并且在个数列中可能有也可能没有零。我还应该添加....整数很好。请参阅下面的部分内容,但可能有前导或尾随空格

Good values:
.1
0.1
1.12
123.12
92
092
092.13

Error values:
0
0.0
0.00
00
1.234
-1
-1.2
Anything less than zero

【问题讨论】:

  • 只是为了检查:小数位不能包含0 并且可以不同于1-2 位或0-2 位? (或者换一种说法:.nn 部分是可选的吗?
  • 是的....nn 部分是可选的。所以整数是允许的。我将其添加到问题中。 THx
  • 在哪里可以找到号码?它们是字符串的唯一内容,还是包含在空格中?这对于匹配92 等至关重要。
  • 它们可能被包含在空格中......并且数字是字符串的唯一内容

标签: regex decimal


【解决方案1】:

这个怎么样:

^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

说明:

^            # Start of string
\s*          # Optional whitespace
(?=.*[1-9])  # Assert that at least one digit > 0 is present in the string
\d*          # integer part (optional)
(?:          # decimal part:
 \.          # dot
 \d{1,2}     # plus one or two decimal digits
)?           # (optional)
\s*          # Optional whitespace
$            # End of string

在 Python 中测试:

>>> import re
>>> test = [".1", "0.1", "1.12", "123.12", "92", "092", "092.13", "0", "0.0", "0.00", "00", "1.234", "-1", "-1.2"]
>>> r = re.compile(r"^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$")
>>> for item in test:
...     print(item, "matches" if r.match(item) else "doesn't match")
...
.1 matches
0.1 matches
1.12 matches
123.12 matches
92 matches
092 matches
092.13 matches
0 doesn't match
0.0 doesn't match
0.00 doesn't match
00 doesn't match
1.234 doesn't match
-1 doesn't match
-1.2 doesn't match

【讨论】:

  • 差不多了。唯一不完全是 0.9 没有前导零。用户不喜欢输入零。
  • @MikeTWebb:它确实允许 .9 - 你为什么认为它不允许?
  • @ridgerunner:谢谢 :) 猜猜我现在在做什么?我已经接手了 EditPadPro 的德文翻译(从第 7 版出来到现在已经 7 个月了,我不想再等了),我快完成了。 (现在正在研究“每日提示”——反正没人读过 :) 可惜,它们真的很棒)
  • 如何允许逗号用于上面提到的正则表达式,即大于零的十进制数?例如:123,45.67。这会起作用吗:^\s*(?=.*[1-9,])\d*(?:\.\d{1,2})?\s*$
  • 不,这行不通(因为您可以轻松地测试自己)。您可以使用^\s*(?=.*[1-9])[\d,]*(?:\.\d{1,2})?\s*$,但也可以使用1,2,3.45,,,,,1 以及其他无意义的数字。
【解决方案2】:

下面的代码允许,.

^(?=.*[1-9])[0-9]*[.,]?[0-9]{1,2}$

【讨论】:

    【解决方案3】:

    [0-9]+\.[0-9]{1,2}

    那会发现:

    • 至少一个数字
    • 小数点
    • 小数点后一位或两位数。

    【讨论】:

    • 这允许 0.0 并且不允许整数。
    • 也允许0.00(错误)和禁止.1(错误)
    【解决方案4】:

    /^[0-9]*(\.{1})?([0-91-9][1-9])?$/

    试试这个,它会通过你所有的案例

    【讨论】:

    • 这(错误地)不匹配 .10.1 并且(错误地)匹配 000
    【解决方案5】:

    允许 2 个十进制数从 00.00 到正值直到 99.99

    /^(?=.*\d)\d{0,2}(?:\.\d{0,2})?$/
    

    【讨论】:

      【解决方案6】:

      此表达式不允许开头和结尾有任何空格

      /^\d*(?:\.\d{1,2})*$/
      

      【讨论】:

      • 这匹配:00.00.0000(所有这些都是问题中给出的否定测试用例)。
      • ^(([1-9]+([.][0-9]{1,3})?)|(0[.][0-9]{2}[1 -9]))$ 认为这会满足条件
      • 您评论中的新模式(错误地)无法匹配.10.1092092.13,并且(错误地)匹配1.234
      • 在作为答案发布之前测试您的正则表达式。有很多在线正则表达式测试器,例如 regexr.com
      猜你喜欢
      • 2022-07-22
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多