浮点数的 TCL 正则表达式在个位数时失败



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

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

它适用于诸如4.08955e-113.57之类的事情。现在,我的解析器偶然遇到了0并失败了。我想我需要使小数点后面的所有内容都是可选的。但是我该怎么做呢?

与人们的想法相反,将每种可能形式的浮点数(包括 NaN 等(与仍然丢弃(例如不可能的大数或伪八进制(的可管理正则表达式进行匹配是不平凡的。

有一些关于通过使用单词边界来降低误报风险的想法,但请注意,这些想法与单词字符(通常是字母数字和下划线(之间的边界相匹配。

scan 命令允许简单可靠地验证和提取浮点数:

scan $number %f

如果您将小数点之后的所有内容都设置为可选(这本身是可选的(,则可以匹配类似 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]+)?$

也许使用替代方案:

{[-+]?(?:y[0-9]+(?:.[0-9]*)?|.[0-9]+y)(?:[eE][-+]?[0-9]+y)?}

最新更新