浮点数的TCL regexp在个位数处失败
我开发了以下regexp来捕获浮点数浮点数的TCL regexp在个位数处失败,regex,tcl,Regex,Tcl,我开发了以下regexp来捕获浮点数 ([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?) 它适用于4.08955e-11或3.57等。现在,由于一个愚蠢的机会,我的解析器遇到了0,并失败了。我想我需要将小数点后的所有内容都设置为可选。但是我该怎么做呢?也许可以使用替代方案: {[-+]?(?:\y[0-9]+(?:\.[0-9]*)?|\.[0-9]+\y)(?:[eE][-+]?[0-9]+\y)?} 如果在小数点后加上所有字符(小数点本身是可选的),则可以匹
([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)
它适用于
4.08955e-11
或3.57
等。现在,由于一个愚蠢的机会,我的解析器遇到了0
,并失败了。我想我需要将小数点后的所有内容都设置为可选。但是我该怎么做呢?也许可以使用替代方案:
{[-+]?(?:\y[0-9]+(?:\.[0-9]*)?|\.[0-9]+\y)(?:[eE][-+]?[0-9]+\y)?}
如果在小数点后加上所有字符(小数点本身是可选的),则可以匹配像
2这样的值。
请注意,您的正则表达式与单个数字不匹配,因为您与一个或多个数字匹配了2次[0-9]+
如果您只想匹配浮点数或零,则可以使用替换,例如使用单词边界\b
:
解释
匹配可选+或-[-+]?
单词边界\b
非捕获组(?:
匹配一个或多个数字点和一个或多个数字[0-9]+\.[0-9]+
可选指数部分(?:[eE][-+]?[0-9]+)?
或|
逐字匹配0
关闭非捕获组)
单词边界\b
与人们的想法相反,将每种可能形式的浮点数(包括NaN等)与仍然丢弃(例如,不可能的大数字或伪八进制)的可管理正则表达式相匹配是非常重要的 有一些关于通过使用单词边界来降低误报风险的想法,但请注意,这些边界与单词字符之间的边界相匹配(通常是字母数字和下划线) scan命令允许简单可靠地验证和提取浮点数:
scan $number %f
是否允许使用以下格式的数字:
.357
?您的regexp至少需要2位数字。一个在
之前,一个在它之后,尽管
本身是可选的。如果搜索[regex]浮点数
,您会发现许多示例。