我有这种模式:
[0-9]*\.?[0-9]
它匹配数字,但它也匹配3.5.4:
如何修复(此输入不应匹配)?
的更新:
这也应该适用于输入:
1 3.5.4 10
1.2。是不允许的 .3是允许的
不允许使用任何不是数字的字符,例如:a1 2.4f 3. 45,67!
答案 0 :(得分:12)
匹配json数字:
^[-]?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?$
使用此正则表达式匹配.123
:
^[-]?((0|[1-9][0-9]*)(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?$
答案 1 :(得分:10)
海报发表评论后更新了答案:
使用lookahead / lookbehind确保前后字符为空格:
这是一个与你的版本非常匹配的版本,但不会进行部分匹配:
(?:^|(?<=\s))[0-9]*\.?[0-9](?=\s|$)
对于这两个示例,当在字符串1 2.3.4 5.6
上运行时,它仅匹配1
和5.6
。
答案 2 :(得分:7)
您必须决定是否要接受不带前导零的数字(例如.123)。如果你不这样做,那么正则表达式很简单:
^-?[0-9]+(\.[0-9]+)?$
如果你这样做,那就有点复杂了:
^-?(?:[0-9]+|[0-9]*\.[0-9]+)$
两者都假设小数点后面必须至少跟一个数字。如果您不接受负数,那么前导-?
是不必要的。
答案 3 :(得分:2)
你的正则表达式没有锚定。如果您想匹配仅包含数字的行而不使用其他内容:
^[0-9]*\.?[0-9]$
答案 4 :(得分:1)
除非你真的需要,否则你不应该使用正则表达式。
相反,您应该使用您的语言的内置数字解析方法。
我从你的其他问题中假设你正在使用Javascript;如果是这样,您应该致电parseFloat
。