快速入门
教程
工具和语言
示例
参考
书评
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期到文本
信用卡号
匹配整行
删除重复行
编程
两个相近的单词
陷阱
灾难性回溯
重复过多
拒绝服务
使所有内容都可选
重复捕获组
混合 Unicode 和 8 位
此网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于此网站
RSS 源和博客
RegexMagic—Generate regular expressions matching floating point numbers

使用正则表达式匹配浮点数

此示例展示了如何避免不熟悉正则表达式的人经常犯的一个常见错误。作为示例,我们将尝试构建一个可以匹配任何浮点数的正则表达式。我们的正则表达式还应匹配整数和未给出整数部分的浮点数。我们不会尝试匹配带有指数的数字,例如 1.5e8(科学记数法中的 1.5 亿)。

乍一看,以下正则表达式似乎可以解决问题:[-+]?[0-9]*\.?[0-9]*。这将浮点数定义为可选符号,后跟一系列数字(整数部分),后跟一个可选的点,后跟另一个可选的数字系列(小数部分)。

用文字拼出正则表达式,显而易见:此正则表达式中的所有内容都是可选的。此正则表达式将符号本身或点本身视为有效的浮点数。事实上,它甚至将空字符串视为有效的浮点数。如果你尝试使用此正则表达式在文件中查找浮点数,你将在字符串中没有浮点数出现的每个位置获得零长度匹配

不转义也是一个常见错误。未转义的点匹配任何字符,包括点。如果我们没有转义点,4.44X4 都将被视为浮点数。

在创建正则表达式时,更重要的是考虑它不应该匹配什么,而不是应该匹配什么。上述正则表达式确实匹配了正确的浮点数,因为正则表达式引擎是贪婪的。但它还匹配了许多我们不想要的东西,我们必须排除这些东西。

这里有一个更好的尝试:[-+]?([0-9]*\.[0-9]+|[0-9]+)。此正则表达式匹配一个可选符号,即要么后跟零个或多个数字,后跟一个点和一个或多个数字(一个带有可选整数部分的浮点数),要么后跟一个或多个数字(一个整数)。

这是一个更好的定义。任何匹配都必须至少包含一个数字。没有办法绕过[0-9]+部分。我们已成功排除了我们不想要的匹配:那些没有数字的匹配。

我们可以优化此正则表达式,如下所示:[-+]?[0-9]*\.?[0-9]+

如果您还想匹配带指数的数字,可以使用:[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?。请注意,我如何通过分组使整个指数部分变为可选,而不是使指数中的每个元素变为可选。

最后,如果你想验证一个特定的字符串是否包含一个浮点数,而不是在较长的文本中查找一个浮点数,你将不得不锚定你的正则表达式:^[-+]?[0-9]*\.?[0-9]+$^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$。你可以在 RegexBuddy 的库 中找到这些正则表达式的其他变体。