正则表达式,用于测试字符串是否包含基数为10的有效实数

时间:2008-09-25 21:06:42

标签: regex parsing

示例:

"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

5 个答案:

答案 0 :(得分:4)

这允许在前面选择“+”和“ - ”。并允许尾随或初始空格。

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

答案 1 :(得分:4)

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

/^[-+]?(?=\.?\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替换为[0-9],因为某些正则表达式不支持\d,或者因为某些正则表达式允许\d匹配Unicode“数字”其他超过0..9,如“阿拉伯语 - 数字指数”。

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

答案 2 :(得分:2)

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

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


不匹配“1” (等):

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


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

答案 3 :(得分:2)

perlfaq4: How do I determine whether a scalar is a number/whole/integer/float?中的正则表达式可以执行您想要的操作,并且它也会处理“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

答案 4 :(得分:0)

根据您在此功能中编码的语言,可能已经存在。