Java使用Pattern matcher校验9位手机号时始终返回false问题
问题根因
校验始终返回false的核心原因是Pattern与Matcher的入参顺序写反,逻辑完全颠倒。Pattern.compile()方法的入参应为正则表达式规则,matcher()方法的入参才是待校验的目标字符串。你当前的代码是将传入的手机号值作为正则规则编译,再拿固定的正则字符串^[0-9]{9}$作为待匹配文本做校验,自然永远无法匹配成功。
以你传入的测试值123456789为例,代码实际执行逻辑为:编译正则123456789,去匹配文本^[0-9]{9}$,二者完全不匹配,因此始终返回校验失败结果。
修复方案
错误代码片段
你当前的校验方法逻辑:
@Override public boolean isValid(String phoneNumber, ConstraintValidatorContext context) { return Pattern.compile(phoneNumber).matcher("^[0-9]{9}$").matches(); }
正确实现代码
建议将正则预编译逻辑提前,避免每次校验都重复编译正则损耗性能,同时补充空值判断(空值校验职责交给@NotNull等专门的空校验注解,符合Bean Validation规范):
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> { // 预编译9位纯数字手机号正则 private static final Pattern PHONE_PATTERN = Pattern.compile("^[0-9]{9}$"); @Override public boolean isValid(String phoneNumber, ConstraintValidatorContext context) { // 空值直接放行,空校验由@NotNull注解负责 if (phoneNumber == null) { return true; } // 正确调用顺序:用正则规则匹配待校验的手机号字符串 return PHONE_PATTERN.matcher(phoneNumber).matches(); } }
补充说明
- 你在模型类中给
name、surname字段加了@NotNull注解,但phoneNumber字段仅加了自定义的@PhoneNumber注解,如果需要强制要求手机号字段非空,记得补充@NotBlank或@NotNull注解,避免空值绕过校验。
内容的提问来源于stack exchange,提问作者Lulex97
相关产品推荐
相关产品推荐

