Java正则表达式修改:如何避免匹配包含数字或特殊字符的单词
正则修改方案
你当前使用的正则仅匹配连续3个及以上的英文字母,没有限制匹配到的字母序列的前后字符,所以只要文本中存在符合长度要求的连续字母就会被提取,哪怕这些字母前后紧跟数字、特殊符号等其他字符,就会出现你遇到的8cuatro提取出cuatro这类不符合预期的结果。
修改后的正则
直接使用的正则表达式:(?<=^|\s)[a-zA-Z]{3,}(?=\s|$)
写在Java代码字符串中时,需要对反斜杠做转义:"(?<=^|\\s)[a-zA-Z]{3,}(?=\\s|$)"
规则说明
(?<=^|\s):反向肯定环视,要求匹配到的字母序列的前侧要么是字符串开头,要么是空白字符(空格、换行、制表符等),避免匹配到前面紧跟数字、特殊符号的字母序列[a-zA-Z]{3,}:和原规则一致,匹配3个及以上的大小写英文字母(?=\s|$):正向肯定环视,要求匹配到的字母序列的后侧要么是字符串结尾,要么是空白字符,避免匹配到后面紧跟特殊符号、数字的字母序列
匹配效果
用修改后的正则匹配你的测试内容,得到的结果如下:
sol perro idea caballo tres ccc coton
完全符合你的要求,8cuatro、3pesos、$dollar$、chien@这类内容都不会被匹配。
扩展说明
如果你需要保留类似cinco.这类后接标点符号的匹配结果,可以把正向环视规则调整为允许后接标点,修改后正则如下:(?<=^|\s)[a-zA-Z]{3,}(?=[\s\p{Punct}]|$)
内容的提问来源于stack exchange,提问作者Orboull Legrosseboul
相关产品推荐
相关产品推荐

