我开发了以下正则表达式来捕获浮点数。
([+-]?[0-9]+.?[0-9]+([eE][-+]?[0-9]+)?)
它适用于诸如4.08955e-11
或3.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)?}