我想匹配十进制数字,例如:
0.0
0.12
1.00
1.12
-0.123
-1.000
-1.123
没有匹配的负零:-0.0
或-0.00
,-0.000
等。
我不知道如何将/^-?[0-9]+\.[0-9]+$/
正则表达式扩展为不允许负零。
更新:
答案 0 :(得分:3)
IIUC,您只需要添加负前瞻 (?!-0\.0+$)
:
^(?!-0\.0+$)-?\d+\.\d+$
示例:
echo '0.0
0.12
1.00
1.12
-0.123
-1.000
-1.123
-0.00
-0.0
-0.000010
-12.34
' | perl -lne 'print if /^(?!-0\.0+$)-?\d+\.\d+$/'
#0.0
#0.12
#1.00
#1.12
#-0.123
#-1.000
#-1.123
#-0.000010
#-12.34
答案 1 :(得分:0)
您可以使用
^-?(?:0*[1-9][0-9]*\.[0-9]+|0\.0*[1-9][0-9]*)$
https://regex101.com/r/z51Jpu/5
这个想法是,在匹配-
之后,要么匹配整数部分中的非零,要么匹配一个零,最后匹配一个非零。
^-?
-字符串的开头,可选的-
(?:[1-9]\.[0-9]*|0\.0*[1-9][0-9]*)
-匹配:
0*[1-9][0-9]*\.[0-9]*
非零整数部分,后跟小数部分或0\.0*[1-9][0-9]*
-零整数部分,而小数部分的某处非零$
-字符串结尾还可以在行中的某处提前查找1到9之间的数字,然后使用原始模式:
^-?(?=[0.]*[1-9])[0-9]+\.[0-9]+$
^^^^^^^^^^^^^^
答案 2 :(得分:0)
这是一种粗略但有效的方法:列举所有可能性并使用替代方法。
^(-\d+\.\d*[1-9]\d*|-\d*[1-9]\d*\.\d+|^\d+\.\d+)$
请注意,您的规则允许匹配数字中的前导零,例如01.1
或-01.0
。您可以用更原始的方式拒绝这些
^(-?0\.\d*[1-9]\d*|-[1-9]\d*\.\d*[1-9]\d*|-[1-9]\d*\.\d+|^[1-9]\d*\.\d+|0.0+)$
测试:
const permissive = /^(-\d+\.\d*[1-9]\d*|-\d*[1-9]\d*\.\d+|^\d+\.\d+)$/;
const strict = /^(-?0\.\d*[1-9]\d*|-[1-9]\d*\.\d*[1-9]\d*|-[1-9]\d*\.\d+|^[1-9]\d*\.\d+|0.0+)$/;
`
0.0
0.00
0.001
0.12
1.00
1.12
-0.123
-1.000
-1.123
10.10
2.2
-2.2
0.00
-10.010
0.101
-0.0
-0.00
-0.000
-2.
.0
-.0
.012
1.
12.
00.
0.
-001.0
-01.0
01.1
010.1010
000.000
00.0
`.split("\n").filter(e => e).forEach(test =>
console.log(
test, "=> permissive:", permissive.test(test),
"... strict:", strict.test(test)
)
);