正则表达式应用-手机号打码

55 阅读2分钟

(一)matchs方法

正则表达式对象有matches方法,它的作用是验证给定的字符串是否满足正则表达式的要求。它的格式如下:

val 结果 = 正则.matches(目标字符串)

其中的结果是一个bool值。

(二)replaceAllin正则替换

功能:对目标字符中的内容,进行正则查找,对找到的内容使用指定的内容进行替换,并返回替换之后的字符串。

格式:正则.replaceAll(目标字符串, 匹配到的内容 => 要替换的内容 )

来,我们看一个简单的例子:把目标字符串中的字符BC换成01。

("bc".r).replaceAll("abcdabcd" => m => "01" )

(三)案例-手机号打码

任务:把手机号的中间4-7位打马赛克,再输出。

用到的方法是:正则匹配分组 + replaceAllIn。

package reg

import java.io.FileWriter

object reg04 {
  def main(args: Array[String]): Unit = {
    // 1.从根目录下读出address.txt的内容
    val content = scala.io.Source.fromFile("address.txt").mkString

    println("读到的文件内容如下:")
    println(content)

    // 2. 找到其中的合法的手机号,把中间4位(3-4-4)用*代替
    // val reg = "1[356789]\d{9}".r
    val reg = "(1[356789]\d\d)(\d{4})(\d{3})".r  // ()是分组


//    println("找到的合法手机号如下:")
//    reg.findAllIn(content).foreach(ele=>println(ele))

    // 在content中,把所有通过正则找到的内容,换成“abc”
    val newContent = reg.replaceAllIn(content,ele => {
      println(ele.group(0))  // 固定表示搭配到的全部内容
      println(ele.group(1))
      println(ele.group(2))
      println(ele.group(3))  // 顺序对应着正则表达式,()包含的内容


      // val phone = ele.toString()
      // println(ele.toString())

      //"手机号的前3位"+"****"+"手机号的后四位"
     // phone.substring(0,3) + "****" + phone.substring(7)
      ele.group(1) + "-****-" +ele.group(3)
    } )
    println("替换后的内容如下:")
    println(newContent)

    // 3.把替换之后的结果写入到address_new.txt文件
    val fileWriter = new FileWriter("address_new.txt")
    fileWriter.write(newContent)
    fileWriter.close()
  }
}

结果如下:

读到的文件内容如下:
张三,xxx省xxx市xxx区xxx街道xxx号,1234567898719876543223
19876543223
1987
6543
223
替换后的内容如下:
张三,xxx省xxx市xxx区xxx街道xxx号,123456789871987-****-223

这里的group是分组的意思,它与正则表达式中的()是一一对应的。

获取的新文件如下:

image.png