如何使用正则负向后行断言排除分数,匹配度量数据中的数值型数量
解决方案
你之前的写法失效是因为负向后行断言的位置放错了:你把(?<!/)放在了数字匹配的后半段,无法检测到数字起始位置前面的/,所以还是会匹配到分数里的分母。
可以直接使用如下正则表达式满足需求:
(?<!/)\d+(?:\.\d+)?(?!/)
语法解释
(?<!/):负向后行断言,放在匹配规则最开头,确保当前匹配的数字串的前一个字符不是/,直接排除分数的分母\d+(?:\.\d+)?:匹配整数或带小数的浮点数,?:用来标记非捕获组,避免产生不必要的分组结果(?!/):负向前行断言,放在匹配规则最末尾,确保当前匹配的数字串的后一个字符不是/,直接排除分数的分子
匹配效果验证
对以下测试文本执行匹配:
1 gal. 500lbs none 2.25gal 4feet twine 2lbs regular and 2lbs lite 3/4gal
可正确命中1、500、2.25、4、2、2,完全不会匹配3/4中的3和4,符合你的需求。
兼容方案(针对不支持负向后行断言的引擎)
如果你的运行环境不支持负向后行断言(比如ES2018之前的JavaScript),可以使用如下写法,取第一个捕获组的内容即可:
(?:^|[^/])\b(\d+(?:\.\d+)?)\b(?!/)
内容的提问来源于stack exchange,提问作者JJL
相关产品推荐
相关产品推荐

