正则表达式编号介于.xx - xxx.xx之间

时间:2014-11-13 03:58:15

标签: regex

我想要捕获任何大于0的数字,从0.01到999,其中.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并限制可选小数之前和之后的字符是麻烦的地方。

2 个答案:

答案 0 :(得分:8)

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

^(?=.*[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 :(得分:3)

出于完整性的目的,这里是一个没有外观断言的解决方案:

^([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位数组成。