常用实用类代码编写
一、题目需求
从键盘输入一串纯数字,判断输入内容是否为合法手机号;自定义号段规则(仅允许 137、138、139 开头),手机号总长度固定为 11 位。题目没有强制限定实现方式,我自主拓展正则表达式完成匹配校验,作为程序优化亮点。
二、完整解题思路
1. 基础需求拆解
- 输入部分:使用
Scanner工具类读取控制台输入的字符串; - 基础校验规则:
- 整体长度必须等于 11 位;
- 前三位只能是 137、138、139;
- 剩余 8 位必须全部是数字;
- 输出逻辑:符合规则输出「合法手机号」,不满足任意一条则输出「号码错误」。
2. 两种实现思路对比
思路一:基础 if 分段判断
不借助正则,纯字符串基础方法实现校验,步骤:
- 判断字符串长度是否等于 11;
- 截取前 3 位子串,判断是否等于
137/138/139; - 循环截取后 8 位每一个字符,判断是否全部为数字;全部满足则号码合法,任一条件不满足直接判定错误。
优点:逻辑直白、新手易理解;缺点:代码冗长,多层 if 嵌套,拓展新号段时修改麻烦。
思路二:正则表达式匹配(自主拓展优化亮点)
Java 字符串自带matches()方法,支持正则全局匹配,一行代码完成全部规则校验。正则表达式解析:^1[3789]\\d{8}$
^:匹配字符串开头,保证第一位固定为 1;[3789]:第二位只能是 3、7、8、9,组合出 137/138/139 开头;\\d{8}:匹配 8 个 0-9 数字,补足 11 位总长;$:匹配字符串结尾,杜绝多余字符。
优点:代码极度简洁,校验规则集中在一处,后续新增号段仅修改正则即可;缺点:需要理解正则语法,属于课本之外自主拓展知识点。
3. 程序完整执行流程
- 导入
java.util.Scanner实现控制台输入; - 主方法内创建 Scanner 对象,提示用户输入手机号;
- 读取输入字符串,调用
matches()结合正则完成一次性校验; - 根据匹配布尔结果打印对应提示;
- 关闭 Scanner 释放输入流资源。
三、完整示例代码
方案二 :自主拓展正则版![]()
四、运行测试说明
以截图测试用例137000举例:输入仅 6 位,长度不足 11,正则匹配失败,控制台输出「号码错误」,和运行截图结果完全一致。
五、实验心得体会
1. 基础知识点收获
本次程序练习巩固了 Java 字符串操作、Scanner 控制台输入、分支判断等基础语法。最开始我先用多层 if 判断完成基础功能,完全贴合题目无额外要求的原始解法,能清晰拆分长度、号段、数字三层校验逻辑,吃透了substring()截取、charAt()取字符、字符串长度判断等基础 API。
2. 自主拓展正则的学习亮点感悟
题目没有规定实现方式,我主动查阅资料引入正则表达式作为优化方案,是本次实验最大收获:
- 正则把多条分散的校验规则整合到一行表达式,代码量大幅精简,可读性更高;原本二三十行的多层 if 判断,压缩为一句
matches()匹配,维护成本大幅降低; - 拓展号段时修改成本极低,如果后续新增 130、131 号段,只需要修改
[3789]为[301789],不用新增多层 if 条件; - 学会了
^、$、\\d、字符集合这类基础正则语法,理解了 Java 中转义符需要双反斜杠\\的特殊规则,掌握了字符串matches()全局匹配的底层逻辑,属于课本之外主动拓展的实用工具知识。
3. 踩坑调试总结
- 正则书写失误:最初漏写
^和$边界符,输入13812345678999超长数字也会判定合法,补上首尾匹配符后才严格限制整体长度; - 转义符错误:直接写
\d编译器报错,Java 字符串中反斜杠需要二次转义,必须写成\\d; - 输入容错问题:使用
next()读取输入,遇到空格会截断,后续可以优化为nextLine()适配带空格的异常输入; - 资源释放:写完校验逻辑后差点忘记
sc.close(),养成关闭 IO 输入流、释放资源的良好编码习惯。
4. 整体学习感悟
这道手机号校验题虽然逻辑简单,但让我体会到同一需求存在多种实现方案:基础 if 适合新手理解底层逻辑,正则适合工程化简洁开发。在题目无强制限制的前提下,主动拓展正则表达式,不仅简化了代码,还自主学习了新知识点。编程不只是完成题目要求,更可以主动思考优化方案,在基础需求之上拓展更高效、易维护的写法,长期坚持这种思路能大幅提升代码编写能力。同时调试过程中遇到的正则语法 bug、长度判断漏洞,也锻炼了自己排查问题、查阅资料解决问题的自主学习能力。
