我开发了以下regexp来捕获浮点数。
([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)
适用于4.08955e-11
或3.57
等内容。现在通过愚蠢的机会我的解析器遇到了0
并且失败了。我想我需要使小数点后面的所有选项都可选。但是我该怎么做?
答案 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
字边界要匹配一个不以点开头的浮点值,可以是一个或多个没有点的数字,你可以使用: