用于测试字符串是否以10为底的有效实数组成的正则表达式

时间:2020-03-06 14:45:01  来源:igfitidea点击:

例子:

"1"     yes
"-1"    yes
"- 3"   no
"1.2"   yes
"1.2.3" no
"7e4"   no  (though in some cases you may want to allow scientific notation)
".123"  yes
"123."  yes
"."     no
"-.5"   yes
"007"   yes
"00"    yes

解决方案

这允许在前面使用可选的" +"和"-"。并允许尾随或者初始空白。

/^\s*[+-]?(?:\d+\.?\d*|\d*\.\d+)\s*$/

根据我们在此功能中进行编码的语言而定,可能已经存在。

匹配所有指定的示例,不捕获任何组:

^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$

不匹配" 1"。 (等等):

^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$

不用打扰空格(使用修剪功能)。

有几种选择。首先,使用零宽度的超前断言可以使其余正则表达式更简单:

/^[-+]?(?=\.?\d)\d*(?:\.\d*)?$/

如果我们想避免前瞻,那么我将不鼓励正则表达式回溯:

/^[-+]?(?:\.\d+|\d+(?:\.\d*)?)$/
/^[-+]?(\.\d+|\d+(\.\d*)?)$/ # if you don't mind capturing parens

请注意,我们说的是"以10为底",因此我们实际上可能希望禁止使用多余的前导零,因为" 014"可能是八进制的:

/^[-+]?(?:\.\d+|(?:0|[1-9]\d*)(?:\.\d*)?)$/
/^[-+]?(\.\d+|(0|[1-9]\d*)(\.\d*)?)$/

最后,由于某些正则表达式不支持\ d或者某些正则表达式允许\ d匹配非0的Unicode"数字",因此我们可能希望将" \ d"替换为" [0-9]"。 9,例如"阿拉伯-印度数字"。

/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/
/^[-+]?(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)$/

perlfaq4中的正则表达式:如何确定标量是数字/整数/整数/浮点数?完成我们想要的操作,并且它也处理" e"表示法。

while( <DATA> )
    {
    chomp;

    print /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ ?
        "$_ Works\n"
        :
        "$_ Fails\n"
        ;
    }

__DATA__
1
-1
- 3
1.2
1.2.3
7e4
.123
123.
.
-.5