19-正则匹配浮点数?又是一道送命题

在这个例子中,我们将展示正则表达式初学者所常犯的错误,以及避免的方法。下面这个例子我们将匹配一个浮点数,这个表达式也可以匹配整数以及省略整数部分的浮点数。它不会匹配带有指数符号的浮点数例如1.5e8

乍看之下答案可能是:[-+]?[0-9]*\.?[0-9]*。这个表达式中首先定义了一个可选的正数负数符号,接下来是一组可选的整数,一个可选的小数点,最后是另一组可选的整数。

这个表达式中的每一个部分都是可选的,所以单个-或者单个.都可以匹配成功。实际上一个空字符串也会匹配成功。如果你在一段文本中使用这个表达式,你会在字符串的每一个位置匹配到一个长度为0的字符串,即使这个位置上没有很合数字。

另一个常见的错误是没有对.进行转义。一个没有转义的.可以匹配任何字符(除了换行符),其中包括 . 本身。例如[-+]?[0-9]*.?[0-9]*可以匹配 4.4 和 4X4。

在编写正则表达式的时候,我们应该更细致地考虑这个表达式不应该匹配什么内容,而不是这个表达式应该匹配什么内容。例如以上这个例子中,表达式可以匹配合法的浮点数(因为正则引擎是贪婪的),但是它也会匹配到许多我们不想要的结果,我们必须排除掉这些不想要的匹配结果。

我们对以上这个表达式进行改进:[-+]?([0-9]*\.[0-9]+|[0-9]+)。这个表达式首先匹配一个可选的正负符号,后面接着一个浮点数或者是一个整数。匹配组中是一个选择符,第一个选项是一个浮点数,其中浮点数的整数部分是可选的,第二个选项是一个整数。

第二个表达式相对于前一个要好得多。任何一个匹配成功的结果至少包含一个数字,因为[0-9]+排除了不包含数字的字符串。这个表达式排除了我们不想要匹配的结果:也就是那些不包含任何数字的字符串。

我们可以继续优化这个表达式:[-+]?[0-9]*\.?[0-9]+.

如果你想匹配包含指数符号的数字,你可以使用[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?。请注意:整个指数部分包含在一个组中,并且这个组是可选的。而不是把指数部分中的指数符号和数字分开例如:[-+]?[0-9]*\.?[0-9]+[eE]?[-+]?[0-9]+

最后,如果你想判断一个字符串是否是浮点数(不是查找一个浮点数),你可以使用位置字符,例如:^[-+]?[0-9]*\.?[0-9]+$


如果文章出现错误,请给我提Issues - -
Github地址

原文

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值