我有下面的正则表达式,我用它来查找字符串中的数字
-?\d*\.?\d+([eE][-+]?\d+)?
并希望对其进行修改,使其只匹配浮点数而不匹配整数。这一点的标准(据我所知)是匹配必须至少具有以下特征之一:.
,e
,E
。然而,我想不出一个很好的方法来将这个需求合并到regex中而不复制主体的大部分。在
复制
经过一段时间的搜索,我发现了Regular expressions match floating point number but not integer,虽然没有明确的标题,但它完全是这个问题的复制品(包括soln)。在
下面是我的解决方案,使用lookahead允许
'1e1'
,但不允许其他没有小数点的值:我想我应该
第一部分与原始表达式相同,但需要句点。第二个捕捉不带句点的情况,需要
[eE][-+]?\d+
部分。在下面的正则表达式可以做到这一点,尽管它有点神秘:
说明:
一个数有三个部分(整数部分、小数部分和指数部分)。如果存在小数部分,则它是
float
,但如果它不存在,则当一个指数部分紧随其后时,该数字仍然可以是一个浮点数。在这意味着我们首先必须在regex中使这三个部分都是可选的。但是,我们需要建立规则,精确地指定哪些部分需要在那里,以使一个有效的浮动。在
幸运的是,有一个技巧可以让我们做到这一点。空的捕获组(
()
)总是匹配(空字符串)。对该组(\1
)的反向引用只有在该组参与匹配时才会成功。通过在每个可选组中插入()
,我们可以稍后测试所需的部分是否参与了匹配。在例如,在Python中:
^{pr2}$测试套件:
相关问题 更多 >
编程相关推荐