我想要捕获任何大于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并限制可选小数之前和之后的字符是麻烦的地方。
答案 0 :(得分:8)
根据您发布的内容使用此模式
^(?=.*[1-9])(?!0\d)(\d{0,3}(?:\.\d{1,2})?)$
^ 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位数组成。