匹配十进制数字

时间:2019-06-05 01:56:08

标签: regex pcre

我想匹配十进制数字,例如:

0.0
0.12
1.00
1.12
-0.123
-1.000
-1.123

没有匹配的负零:-0.0-0.00-0.000等。

我不知道如何将/^-?[0-9]+\.[0-9]+$/正则表达式扩展为不允许负零。

更新:

  • 不允许使用前导零:01.1或-01.1
  • 必须使用全角和小数字符(不允许.5或5。

3 个答案:

答案 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]+$
   ^^^^^^^^^^^^^^

https://regex101.com/r/z51Jpu/6

答案 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)
  )
);