浮点的TCL正则表达式以单个数字失败

时间:2018-04-10 00:04:39

标签: regex tcl

我开发了以下regexp来捕获浮点数。

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

适用于4.08955e-113.57等内容。现在通过愚蠢的机会我的解析器遇到了0并且失败了。我想我需要使小数点后面的所有选项都可选。但是我该怎么做?

3 个答案:

答案 0 :(得分:2)

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

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

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

scan $number %f

答案 1 :(得分:0)

也许使用替代品:

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

答案 2 :(得分:0)

如果你全部跟随小数点optional(它本身是可选的),你可以匹配像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]+)?$