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

23 阅读3分钟

(一)matchs方法

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

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

其中的结果是一个bool值。

(二)  案例 -验证 合法用户名

背景:你开发了一个论坛注册程序,允许用户去注册账号。但是对于用户输入的用户名需要遵循一定的规则。具体的规则如下:

规则1:合法用户名通常允许包含大小写字母(a-z、A-Z)、数字(0-9)以及下划线(_)

规则2:用户名长度一般限定在 6 到 12 位之间

规则3:不能以数字开头。

当然,你也可以补充你自己的规则,或者对这个规则进行调整和修改。

 

需求:如何写代码才能确保用户输入的内容符合要求?

正则表达式编写:^[a-zA-Z][a-zA-Z0-9_]{5,11}$

详细解读:

[a-zA-Z]:明确限定用户名的首字符只能是大小写字母中的任一个,筛选掉不符合开头规范的情况。

[a-zA-Z0-9_]{5,11}:表示后续字符可以是大小写字母、数字、下划线,且总长度要在 5 到 11位之间(加上开头的 1 个字母,整体用户名长度就在 6 到 12 位),以此保证用户名有合适的长度且字符构成合规。这里使用花括号限定重复次数范围,确保长度约束生效。

在这段代码中:

预先定义了多个风格各异的用户名字符串,涵盖合法与不合法情形,全面测试正则表达式的甄别能力。

第二课时

前面我们已经学习了如何使用正则表达式来匹配,接下来,我们就开始学习如恶化使用正则表达式来做替换。

先要学一下基本函数功能。

(三)replaceAllin正则替换

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

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

实例:

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

(四)案例- 手机号打码****

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

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

package reg

/**scala
 * 目标: 手机号码打码
 *     13612345678 -> 136****5678
 *
 * 任务: 从一个文本文件中, 读出一段内容, 把其中的手机号识别出来, 并打码。
 * address.txt
 * 湖北省 潜江市 庆丰办事处 X栋3单元 张先生 13612345678
 */
object reg04 {
  def main(args: Array[String]): Unit = {
    // 1. 从文件中读取内容
    val content = scala.io.Source.fromFile("address.txt").mkString
    println("读入进来的内容是:")
    println(content)
    //2.
    val reg = "1[35678]\d{9}".r
    reg.findAllIn(content).foreach(println)
    // 替换:正则的典型的应用场景
    // replaceAllIn: 全部替换。
    // 在content中通过正则去执行寻,找到了之后,就换成指定的内容,并把最终的结果保存到newContent
    val newContent = reg.replaceAllIn(content, "有手机号")
    println("替换之后的内容是:")
    println(newContent)
  }
}

image.png