[英]TCL regexp for float fails at single digit
我开发了以下正则表达式来捕获浮点数。
([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)
它适用于4.08955e-11
或3.57
类的东西。 现在,我的解析器偶然遇到0
,但失败了。 我想我需要将所有在小数点后的内容都设为可选。 但是我该怎么做呢?
与人们可能想到的相反,将所有可能的浮点数形式(包括NaN等)与可管理的正则表达式进行匹配,而该正则表达式仍会丢弃例如不可能的大数或伪八进制数,这并非易事。
有一些想法可以通过使用单词边界来降低误报的风险,但请注意,这些匹配单词字符之间的边界(通常是字母数字和下划线)。
scan命令允许简单可靠地验证和提取浮点数:
scan $number %f
也许使用替代方法:
{[-+]?(?:\y[0-9]+(?:\.[0-9]*)?|\.[0-9]+\y)(?:[eE][-+]?[0-9]+\y)?}
如果将小数点后的所有内容设为可选 (其本身是可选的),则可以匹配2.
值2.
请注意,您的正则表达式不匹配一位数字,因为您匹配2倍一位或多位数字[0-9]+
如果只想匹配浮点数或零,则可以使用交替形式,例如使用单词边界\\b
:
\\b[-+]?(?:[0-9]+\\.[0-9]+(?:[eE][-+]?[0-9]+)?|0)\\b
说明
[-+]?
匹配可选的+或- \\b
字边界 (?:
非捕获组
[0-9]+\\.[0-9]+
匹配一个或多个数字点和一个或多个数字 (?:[eE][-+]?[0-9]+)?
可选指数部分 |
要么 0
字面上匹配 )
关闭非捕获组 \\b
字边界 要匹配不以点开头并且可以是一个或多个不带点的数字的浮点值,请冷使用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.