用于测试字符串是否以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