You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含连字符"-"的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:08