常用实用类代码编写

常用实用类代码编写

一、题目需求

从键盘输入一串纯数字,判断输入内容是否为合法手机号;自定义号段规则(仅允许 137、138、139 开头),手机号总长度固定为 11 位。题目没有强制限定实现方式,我自主拓展正则表达式完成匹配校验,作为程序优化亮点。

二、完整解题思路

1. 基础需求拆解

  1. 输入部分:使用Scanner工具类读取控制台输入的字符串;
  2. 基础校验规则:
    • 整体长度必须等于 11 位;
    • 前三位只能是 137、138、139;
    • 剩余 8 位必须全部是数字;
  3. 输出逻辑:符合规则输出「合法手机号」,不满足任意一条则输出「号码错误」。

2. 两种实现思路对比

思路一:基础 if 分段判断

不借助正则,纯字符串基础方法实现校验,步骤:

  1. 判断字符串长度是否等于 11;
  2. 截取前 3 位子串,判断是否等于137/138/139
  3. 循环截取后 8 位每一个字符,判断是否全部为数字;全部满足则号码合法,任一条件不满足直接判定错误。

优点:逻辑直白、新手易理解;缺点:代码冗长,多层 if 嵌套,拓展新号段时修改麻烦。

思路二:正则表达式匹配(自主拓展优化亮点)

Java 字符串自带matches()方法,支持正则全局匹配,一行代码完成全部规则校验。正则表达式解析:^1[3789]\\d{8}$

  • ^:匹配字符串开头,保证第一位固定为 1;
  • [3789]:第二位只能是 3、7、8、9,组合出 137/138/139 开头;
  • \\d{8}:匹配 8 个 0-9 数字,补足 11 位总长;
  • $:匹配字符串结尾,杜绝多余字符。

优点:代码极度简洁,校验规则集中在一处,后续新增号段仅修改正则即可;缺点:需要理解正则语法,属于课本之外自主拓展知识点。

3. 程序完整执行流程

  1. 导入java.util.Scanner实现控制台输入;
  2. 主方法内创建 Scanner 对象,提示用户输入手机号;
  3. 读取输入字符串,调用matches()结合正则完成一次性校验;
  4. 根据匹配布尔结果打印对应提示;
  5. 关闭 Scanner 释放输入流资源。

三、完整示例代码

方案二 :自主拓展正则版

四、运行测试说明

以截图测试用例137000举例:输入仅 6 位,长度不足 11,正则匹配失败,控制台输出「号码错误」,和运行截图结果完全一致。

五、实验心得体会

1. 基础知识点收获

本次程序练习巩固了 Java 字符串操作、Scanner 控制台输入、分支判断等基础语法。最开始我先用多层 if 判断完成基础功能,完全贴合题目无额外要求的原始解法,能清晰拆分长度、号段、数字三层校验逻辑,吃透了substring()截取、charAt()取字符、字符串长度判断等基础 API。

2. 自主拓展正则的学习亮点感悟

题目没有规定实现方式,我主动查阅资料引入正则表达式作为优化方案,是本次实验最大收获:

  • 正则把多条分散的校验规则整合到一行表达式,代码量大幅精简,可读性更高;原本二三十行的多层 if 判断,压缩为一句matches()匹配,维护成本大幅降低;
  • 拓展号段时修改成本极低,如果后续新增 130、131 号段,只需要修改[3789][301789],不用新增多层 if 条件;
  • 学会了^$\\d、字符集合这类基础正则语法,理解了 Java 中转义符需要双反斜杠\\的特殊规则,掌握了字符串matches()全局匹配的底层逻辑,属于课本之外主动拓展的实用工具知识。

3. 踩坑调试总结

  1. 正则书写失误:最初漏写^$边界符,输入13812345678999超长数字也会判定合法,补上首尾匹配符后才严格限制整体长度;
  2. 转义符错误:直接写\d编译器报错,Java 字符串中反斜杠需要二次转义,必须写成\\d
  3. 输入容错问题:使用next()读取输入,遇到空格会截断,后续可以优化为nextLine()适配带空格的异常输入;
  4. 资源释放:写完校验逻辑后差点忘记sc.close(),养成关闭 IO 输入流、释放资源的良好编码习惯。

4. 整体学习感悟

这道手机号校验题虽然逻辑简单,但让我体会到同一需求存在多种实现方案:基础 if 适合新手理解底层逻辑,正则适合工程化简洁开发。在题目无强制限制的前提下,主动拓展正则表达式,不仅简化了代码,还自主学习了新知识点。编程不只是完成题目要求,更可以主动思考优化方案,在基础需求之上拓展更高效、易维护的写法,长期坚持这种思路能大幅提升代码编写能力。同时调试过程中遇到的正则语法 bug、长度判断漏洞,也锻炼了自己排查问题、查阅资料解决问题的自主学习能力。