手机号脱敏处理(Python/Scala 双版本实现)

scala 复制代码
import re

# 1. 读取原文件
with open("address.txt", "r", encoding="utf-8") as f:
    content = f.read()

# 2. 识别并替换手机号
# 正则匹配11位手机号,替换中间4位为####
processed_content = re.sub(
    r"(\d{3})\d{4}(\d{4})",  # 匹配规则:前3位+中间4位+后4位
    r"\1####\2",            # 替换为:前3位+####+后4位
    content
)

# 3. 保存到新文件
with open("processed_address.txt", "w", encoding="utf-8") as f:
    f.write(processed_content)
  • 原内容(address.txt):小花,xxx盛世城3楼303号,13617234567。
  • 处理后(processed_address.txt):小花,xxx盛世城3楼303号,136####4567。
scala 复制代码
object reg04 {
  def main(args: Array[String]): Unit = {
    // 1. 读入文件。根目录下的address.txt
    val source = scala.io.Source.fromFile("address.txt").mkString
    // println(source)

    // 2. 识别手机号
    //val reg = "1[3456789]\d{9}".r
    val reg = "(1[3456789])(\d{4})(\d{4})".r

    // 3. 替换
    // group 分组
    // group(0) 匹配到的整个字符串
    // group(1) 匹配到的第1个括号
    // group(2) 匹配到的第2个括号
    // group(3) 匹配到的第3个括号
    val newSource = reg.replaceAllIn(source, m => {
      println(m.group(0))
      println(m.group(1))
      println(m.group(2))
      println(m.group(3))
      m.group(1) + "*****" + m.group(3)
      // println(m.toString)
      // m.toString
    })

    // 4. 输出文件
    val writer = new java.io.PrintWriter("address_new.txt")
    writer.write(newSource)
    writer.close()
  }
}

scala

csharp 复制代码
object reg04 {
  • 定义一个 Scala 单例对象(object),名为reg04,Scala 程序的入口逻辑通常写在单例对象中。

scala

arduino 复制代码
  def main(args: Array[String]): Unit = {
  • 定义程序的主入口方法main

    • args: Array[String]:接收命令行参数(本代码未使用);
    • Unit:表示方法无返回值(类似 Java 的void)。

scala

ini 复制代码
    // 1. 读入文件。根目录下的address.txt
    val source = scala.io.Source.fromFile("address.txt").mkString
  • 读取文件内容

    • scala.io.Source.fromFile("address.txt"):打开项目根目录下的address.txt文件,创建文件读取源;
    • .mkString:将文件中的所有字符读取为一个完整的字符串,赋值给不可变变量source

scala

arduino 复制代码
    // println(source)
  • 注释掉的调试代码:打印原始文件内容,用于验证是否正确读取文件。

scala

ini 复制代码
    // 2. 识别手机号
    //val reg = "1[3456789]\d{9}".r
    val reg = "(1[3456789])(\d{4})(\d{4})".r
  • 定义手机号匹配的正则表达式

    • 注释的reg = "1[3456789]\d{9}".r:匹配完整的 11 位手机号(1开头 + 3/4/5/6/7/8/9 + 9 位任意数字),但未分组;

    • 生效的reg = "(1[3456789])(\d{4})(\d{4})".r

      • 用括号()将手机号拆分为 3 个分组,方便后续替换:

        • 第 1 组(1[3456789]):手机号前 3 位(运营商号段);
        • 第 2 组(\d{4}):手机号中间 4 位(要打码的部分);
        • 第 3 组(\d{4}):手机号后 4 位;
      • .r:将字符串转换为 Scala 的正则表达式对象。

scala

java 复制代码
    // 3. 替换
    // group 分组
    // group(0) 匹配到的整个字符串
    // group(1) 匹配到的第1个括号
    // group(2) 匹配到的第2个括号
    // group(3) 匹配到的第3个括号
    val newSource = reg.replaceAllIn(source, m => {
  • 批量替换匹配到的手机号

    • reg.replaceAllIn(source, 替换规则):在source字符串中,找到所有匹配reg的手机号,按规则替换;
    • m => {...}:匿名函数(替换逻辑),m是每个匹配到的手机号的 "匹配对象",包含分组信息。

scala

scss 复制代码
      println(m.group(0))
      println(m.group(1))
      println(m.group(2))
      println(m.group(3))
  • 调试打印:输出每个匹配到的手机号的完整内容和分组内容,例如:

    • 若匹配到13617234567,则:

      • m.group(0)13617234567(完整手机号);
      • m.group(1)136(前 3 位);
      • m.group(2)1723(中间 4 位);
      • m.group(3)4567(后 4 位)。

scala

csharp 复制代码
      m.group(1) + "*****" + m.group(3)
  • 核心替换逻辑

    • 拼接 "前 3 位 + ***** + 后 4 位",替换原手机号;
    • 例如:136 + ***** + 4567136*****4567

scala

arduino 复制代码
      // println(m.toString)
      // m.toString
    })
  • 注释的调试代码:m.toString等价于m.group(0),即打印完整匹配的手机号。

scala

go 复制代码
    // 4. 输出文件
    val writer = new java.io.PrintWriter("address_new.txt")
    writer.write(newSource)
    writer.close()
  • 保存处理后的内容

    • new java.io.PrintWriter("address_new.txt"):创建打印写入器,指向新文件address_new.txt
    • writer.write(newSource):将替换后的字符串写入新文件;
    • writer.close():关闭写入器,释放文件资源(必须执行,否则内容可能无法写入)。

scala

复制代码
  }
}
  • 闭合main方法和单例对象。

关键注意点

  1. 正则匹配范围:原代码的正则是 "非整行匹配",能识别嵌入在文本中的手机号(如 "小花 13617234567 地址"),而非仅独立一行的手机号;
  2. 打码符号 :代码中是*****,若需改为####,只需把m.group(1) + "*****" + m.group(3)中的*****替换为####
  3. 编码问题 :原代码未指定文件编码,若文件包含中文,可能出现乱码,建议补充编码(如fromFile("address.txt", "UTF-8"));
  4. 资源释放PrintWriter需手动close(),否则文件可能无法正常保存。
相关推荐
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble5 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖6 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707537 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.7 小时前
Day06——权限认证-项目集成
java
瑶山7 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy7 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732067 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea