在Java应用程序开发中,处理用户输入时经常需要对电话号码这类特定格式的内容做校验,同时为了避免用户因输入错误反复操作,还需要搭配循环重试机制,让交互流程更友好。下面我们一步步实现这个功能。

电话号码格式定义
国内常见的电话号码格式为11位,且以1开头,第二位为3-9的数字,后续9位为任意数字。我们可以用正则表达式来匹配这个规则,正则表达式为^1[3-9]d{9}$,其中各个部分的含义如下:
- ^ 表示匹配字符串开头
- 1 表示第一位固定为数字1
- [3-9] 表示第二位为3到9之间的任意数字
- d{9} 表示后续有9位数字
- $ 表示匹配字符串结尾
校验方法实现
我们可以编写一个独立的校验方法,接收用户输入的字符串,返回布尔值表示是否符合电话号码格式:
import java.util.regex.Pattern;
public class PhoneValidator {
// 电话号码正则匹配规则
private static final String PHONE_REGEX = "^1[3-9]\d{9}$";
// 编译正则模式,提升匹配效率
private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX);
/**
* 校验电话号码格式是否合法
* @param phone 用户输入的电话号码字符串
* @return 合法返回true,否则返回false
*/
public static boolean validatePhone(String phone) {
if (phone == null || phone.trim().isEmpty()) {
return false;
}
return PHONE_PATTERN.matcher(phone.trim()).matches();
}
}
循环重试机制实现
接下来结合Scanner获取用户输入,当输入格式错误时持续提示用户重新输入,直到输入合法为止:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String phone;
// 循环重试逻辑
while (true) {
System.out.println("请输入您的11位电话号码:");
phone = scanner.nextLine();
if (PhoneValidator.validatePhone(phone)) {
System.out.println("电话号码格式校验通过,您输入的号码是:" + phone);
break;
} else {
System.out.println("输入的电话号码格式错误,请重新输入,格式要求为11位以1开头的手机号");
}
}
scanner.close();
}
}
逻辑说明
上述代码中,我们先通过PhoneValidator.validatePhone方法判断用户输入是否符合规则,如果不符合就输出错误提示,继续等待用户输入,直到输入合法才退出循环。这里使用Pattern.compile预编译正则表达式,避免每次校验都重新编译正则,提升执行效率。
扩展说明
如果需要支持带区号的固定电话或者国际号码,只需要调整正则表达式即可,比如支持带连字符的固定电话可以修改正则规则为^(d{3,4}-)?d{7,8}$,校验逻辑和循环重试的逻辑不需要做大的调整,只需要替换对应的正则规则就能适配不同的格式需求。