如何调整正则表达式,避免匹配命名材料中的数字?
解决正则误匹配文本后紧跟数字的问题
你写的正则能匹配各类数字,但没限制数字的前置场景,所以会误抓Nylon-12这类文本后的符号+数字组合。要只提取和文本用空格分隔的数字,给正则加个前置断言就能解决:
最终可用的正则
(?<!\w)([+\-]?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?(?:0|[1-9]\d*)(?:\.\d+)?))
关键改动解释
(?<!\w):这是负向零宽断言,作用是确保当前数字的前一个字符不是单词字符(字母、数字、下划线):- 碰到
Nylon-12时,-前面是字母n(属于单词字符),断言不成立,不会匹配-12; - 碰到
by -7.89时,-前面是空格(非单词字符),断言成立,正常匹配-7.89; - 行首的数字(比如句子开头的
+123)也能正常匹配,因为行首没有前置字符,断言自动成立。
- 碰到
进阶:严格限制空格包裹
如果要求数字必须完全被空格/行首/行尾包围(比如要排除(1.23)或abc+456这类情况),可以用更严格的版本:
(?:^|\s)([+\-]?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?(?:0|[1-9]\d*)(?:\.\d+)?))(?:$|\s)
(?:^|\s):匹配行首或空格(用非捕获组,避免把空格也抓进来);(?:$|\s):匹配行尾或空格,确保数字后面不是文本。
用你的测试句The block of Nylon-12 was 1.23 by 4E-56 by -7.89测试,两个正则都能准确提取1.23、4E-56、-7.89,不会误抓Nylon-12里的-12。
内容的提问来源于stack exchange,提问作者iato
相关产品推荐
相关产品推荐

