我希望除了一些不同语法的数字,我想为这个任务/匹配找到最好的正则表达式。
首先是一些有效数字:
0.01
0.2
0.38
45
165.6
52732.08
999999999.99
这里有一些无效的数字:
.01
.2
.50
.85
45.
45.0
45.00
00045.0
124.60
000124.60
124,6
000053853.01
999.999.999,99
999999999,99
经过多次测试后,我创建了以下正则表达式:
^[1-9]?\d{1,9}\.?\d{1,2}(?<!0)$
但我总是在努力争取数字:000058723.01
有什么想法吗?感谢。
答案 0 :(得分:1)
您可以使用此正则表达式:
^(?!0+\d)\d+(?:\.(?![1-9]*0+$)\d{1,2})?$
或者:
^(?:0+|[1-9]\d*)(?:\.(?![1-9]*0+$)\d{1,2})?$
答案 1 :(得分:1)
答案 2 :(得分:0)
以下是正则表达式的固定版本:
^(?!0{2,})\d+(?:\.\d{1,2}(?<!0))?$
此处,前瞻(?!0{2,})
不允许初始2个或更多零,并且小数部分在非捕获组(?:\.\d{1,2}(?<!0))?
内可选。
请参阅demo
如果您不想与0
匹配,可以在否定前瞻中排除这一点:
^(?!0{2,}|0$)\d+(?:\.\d{1,2}(?<!0))?$
^^
请参阅Demo 2
答案 3 :(得分:0)
您接受四种输入:
没有小数位且没有前导零的数字:[1-9]\d*
零后跟一个点后跟数字(不带尾随零):0\.\d*[1-9]
没有前导或尾随零的十进制数:[1-9]\d*\.\d*[1-9]
零:0
把四个放在一起:
^([1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]|0)$
答案 4 :(得分:0)
带有可选小数的数字由两部分组成:整数部分和以点开头的可选小数部分。
整数部分为零(0
)或以1..9
开头的数字序列(无0
)并且可以继续使用零个或多个数字:
0|[1-9][0-9]*
如果您需要对整数部分的长度施加上限,请将*
替换为{,n}
,其中n
是允许的最大长度减去1。
小数部分以点(.
)开头,后跟零个或多个数字,后跟1..9
之一(最后允许0
)。
表达式是:
\.[0-9]*[1-9]
现在让我们把它们结合起来:
^(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$
我加入作品时添加的内容:
^
- 匹配字符串的开头;如果没有这个,则regex
与45.0
; 00045.0
匹配
由于|
; 的优先级较低,?
表示整个小数部分是可选的; $
- 匹配字符串的结尾,以避免与124.6
匹配124.60
。以上regex
旨在与您的示例相匹配。但是,请注意,大多数编程语言允许您放入“无效”部分的大部分或全部数字,并使用点(.
)作为小数分隔符。许多语言提供的库函数能够解析使用逗号(,
)作为小数分隔符的数字。
没有整数部分(.85
)的数字,在带有尾随零(45.
)的点(45.0
)之后没有数字是有效的,并且没有歧义地解释。
唯一的麻烦制造者是领先的零(00045.0
)。对于整数,大多数情况下,它是一个信号,表示数字用基数8
表示,而对于实数,它只是被忽略。