string.matches()要求整个字符串完全匹配正则表达式,等价于隐式添加^和$,不支持null输入,空字符串可匹配如a*但不匹配a+,高频使用应预编译pattern以提升性能。

String.matches() 方法用于判断字符串是否**完全匹配**给定的正则表达式,它内部调用 Pattern.matches(regex, str),等价于用该正则对整个字符串做“全串匹配”(即隐式加上 ^ 和 $)。
matches 是全匹配,不是查找
很多人误以为 matches() 类似于“包含某模式”,其实它要求**整个字符串都符合正则**。例如:
-
"abc123".matches("\d+")→ false(全是数字才匹配) -
"123".matches("\d+")→ true -
"abc".matches("a.*c")→ true(从头 a 开始,到末尾 c 结束) -
"abcc".matches("a.*c")→ true(.*匹配中间任意字符,结尾是 c)
注意转义和特殊字符
Java 字符串中反斜杠 需要双写,正则里的元字符(如 .、+、*、?、[、( 等)必须正确转义:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 匹配邮箱:
email.matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$") - 匹配手机号(简单版,11位数字开头为1):
phone.matches("1\d{10}") - 匹配带小数点的数字:
"3.14".matches("\d+\.\d+")(注意.要写成\.)
空字符串和 null 要提前判断
matches() 不能作用于 null,否则抛 NullPointerException;空字符串 "" 可以调用,但是否匹配取决于正则本身:
-
"".matches("")→ true(空正则匹配空串) -
"".matches("a*")→ true(a*允许零个 a) -
"".matches("a+")→ false(a+至少一个 a) - 安全写法:
str != null && str.matches(regex)
性能与替代方案
每次调用 matches() 都会重新编译正则(除非 JVM 有缓存优化),高频校验建议复用 Pattern:
- 一次性校验:直接用
str.matches(regex)最简洁 - 多次校验同一正则:
Pattern pattern = Pattern.compile(regex); ... pattern.matcher(str).matches(); - 只需判断是否“包含”而非全匹配:用
Pattern.compile(regex).matcher(str).find()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










