String.matches() 仅支持全字符串匹配(隐含^和$),不支持子串查找;适用于简单格式校验,如手机号、用户名等,但需注意转义、性能及空字符串处理。

Java 中 String.matches() 方法可以快速校验字符串是否**完全匹配**某个正则表达式,但要注意它隐含了全字符串匹配(即自动加了 ^ 和 $),不是查找子串。用对了很简洁,用错了会莫名其妙失败。
matches 的本质是“全匹配”,不是“包含匹配”
matches() 判断的是整个字符串是否**从头到尾**都符合正则,不支持部分匹配。比如:
-
"abc123".matches("\d+")→ false(全是数字才匹配,而它以字母开头) -
"123".matches("\d+")→ true -
"email@domain.com".matches("[a-z]+@[a-z]+\.[a-z]+")→ true(完整邮箱格式,小写字母限定)
常用校验场景与写法示例
直接用 matches() 做格式校验,无需额外编译 Pattern,适合简单、高频判断:
-
手机号(国内 11 位,1 开头):
phone.matches("1[3-9]\d{9}") -
6–20 位字母数字下划线:
username.matches("[a-zA-Z0-9_]{6,20}") -
非空且只含中文、英文字母、数字、短横线:
name.matches("[\u4e00-\u9fa5a-zA-Z0-9-]+") -
带可选协议的 URL(简化版):
url.matches("https?://[\w.-]+(?:/[\w.-]*)*")
容易踩的坑和应对建议
别被“看起来能匹配”骗了,注意边界和转义:
立即学习“Java免费学习笔记(深入)”;
- 正则中
.、?、+、*等元字符要正确转义,Java 字符串里需写双反斜杠:"\d{3}-\d{4}"表示d{3}-d{4} - 如果想检查“是否包含某模式”,别用
matches(),改用Pattern.compile("xxx").matcher(str).find() - 对同一正则反复校验大量字符串时,建议预编译
Pattern提升性能,matches()每次都重新编译 - 空字符串
""对大多数非空正则都会返回 false,如有需要单独判空
替代方案:什么时候不该用 matches
当你要做这些事时,matches() 就不合适了:
- 提取匹配内容(用
Matcher.group()) - 替换匹配部分(用
String.replaceAll()) - 校验逻辑复杂、需多次复用同一正则(预编译 Pattern 更高效)
- 允许前后有无关字符,只要中间存在目标模式(该用
find())


















