【问题标题】:Regex numbers between .xx - xxx.xx.xx - xxx.xx 之间的正则表达式数字
【发布时间】:2015-01-10 03:19:17
【问题描述】:

我想捕捉任何大于 0 的数字,从 0.01 到 999,其中 0.01 也是可以接受的。

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

应该匹配:(如果存在小数,则最多前 3 个数字,后面最多 2 个数字。)

.01
.1
0.01
0.1
1
10
10.1
10.11
105.1
999.99
88.00

应该失败:

12345678.54
00564.5412
00.451
1.
,25
..25
0025
01
00,25
0
.0
0.001
999.001
e123.12
1000

http://regex101.com/r/qZ5lC6/1 - .x 和限制可选小数前后的字符是麻烦的地方。

【问题讨论】:

标签: regex


【解决方案1】:

根据您发布的内容使用此模式

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

Demo

^               Start of string/line
(?=             Look-Ahead
  .             Any character except line break
  *             (zero or more)(greedy)
  [1-9]         Character Class [1-9]
)               End of Look-Ahead
(?!             Negative Look-Ahead
  0             "0"
  \d            <digit 0-9>
)               End of Negative Look-Ahead
(               Capturing Group \1
  \d            <digit 0-9>
  {0,3}         (repeated {0,3} times)
  (?:           Non Capturing Group
    \.          literal "."
    \d          <digit 0-9>
    {1,2}           (repeated {1,2} times)
  )             End of Non Capturing Group
  ?             (zero or one)(greedy)
)               End of Capturing Group \1
$               End of string/line

【讨论】:

  • +1 这比我的(现已删除)解决方案好;做得很好。
【解决方案2】:

为了完整起见,这里是一个没有环视断言的解决方案:

^([1-9]\d{0,2}(\.\d{1,2})?|0?\.(\d[1-9]|[1-9]\d?))$

(必要时使捕获组不捕获)

[1-9]\d{0,2}(\.\d{1,2})? 匹配从 1 到 999 的整数,或从 1.00 到 999.99 的十进制数,这两种情况都没有前导 0,小数部分可以有 1 位或 2 位数字。

0?\.(\d[1-9]|[1-9]\d?) 匹配 0.01 到 0.99,整数部分的 0 可选,小数部分由 1 位或 2 位组成。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多