繁体   English   中英

TCL的TCL regexp浮点数失败

[英]TCL regexp for float fails at single digit

我开发了以下正则表达式来捕获浮点数。

([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)

它适用于4.08955e-113.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字边界

要匹配不以点开头并且可以是一个或多个不带点的数字的浮点值,请冷使用:

^[-+]?[0-9]+(?:\\.[0-9]+)?(?:[eE][-+]?[0-9]+)?$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM