含连字符"-"的Pattern匹配未达预期,Pattern.matches返回false问题咨询
解决正则字符类中连字符匹配失效的问题
你遇到的这个问题其实是正则表达式里的一个常见坑——字符类[]里的连字符位置不对,导致它被当成了范围界定符,而不是普通的匹配字符。
问题原因
在正则的字符类[!@#$%^&*()-+]中,()-+这部分会被解析为ASCII字符范围:从)(ASCII码41)到+(ASCII码43)的字符,也就是只包含)、*、+这三个字符,完全没把单独的-算进去,所以自然匹配不到字符串AUzs-nV里的-。
两种修复方案
方案1:把连字符放在字符类的开头或结尾
当-出现在字符类的最前面或者最后面时,正则引擎会把它当成普通字符处理,不会解析为范围界定符。比如:
// 把-放在开头 Pattern.matches(".*[-!@#$%^&*()+].*", "AUzs-nV") // 或者放在结尾 Pattern.matches(".*[!@#$%^&*()+_-].*", "AUzs-nV")
这两种写法都会正确匹配到-,返回true。
方案2:用反斜杠转义连字符
如果一定要把-放在字符类中间,可以用\转义它,但因为Java字符串里\本身需要转义,所以要写成\\-:
Pattern.matches(".*[!@#$%^&*()\\-+].*", "AUzs-nV")
这样也能让引擎把-当成普通字符匹配。
另外补充一句:Pattern.matches方法是要求整个字符串完全匹配正则表达式的,你前后加的.*是对的,确保只要字符串里包含任意一个目标符号就会返回匹配成功。
内容的提问来源于stack exchange,提问作者prasadn
相关产品推荐
相关产品推荐

