正则表达式

前面我们学习了文件匹配相关的内容,其中在做单词调频统计的时侠,用到了IW+这个内容,当时没有展开来介绍。今天花一节课的时间,我们来学习一下正则表达式。

1.正则表达式的定义

正则表达式(Regular Expression)是一种用一匹配、查找和替换文本中特定模式的字符串。

它是一种强大的文本处理工具,通过定义一系列的字符和操作符组合来描述这些模式。简单来说,它就像是一种文本模式的"配方",可以让计真机根据这个"配方" 在文本中找到符合要求的内容。

第一个正则表达式的案例如下:

Scala 复制代码
object test {
  def main(args: Array[String]): Unit = {
    //定义一个规则 正则表达式
    val reg = "[123]".r

    // 1.查找。在目标字符串中,找到符合正则表达式规则要求的 子串
//    val rs = reg.findFirstIn("abc")
//    if(rs.isEmpty){
//      println("你找到的,符合正则表达式要求的内容是",rs.get)
//    }
    reg.findAllIn("1a 2bc a3b").toList.foreach(println)
  }
}

案例:

1:明确匹配手机号码首位数字"1",契合国内手机号起始数字规范。

3-9:字符类设定,限定手机号第二位数字取值在"3"至"9"这个区间内,筛除不符合运营商号段分配起始数字规律的值。

\\d{9}:\\d代表数字字符(等同于0-9),9量词修饰,表明需紧接着匹配连续9个数字,对应手机号陈去前两位固定格式外的后续数字部分。

Scala 复制代码
object test {
  def main(args: Array[String]): Unit = {
//    println("a\tb")
    //定义一个规则 正则表达式
//    val reg = "[a-zA-Z0-9]".r
//    val reg = "^a$".r
    //1. . 表示 除了换行之外的其他的任意单个字符
    //2. \d 等于[0-9] 匹配一个数字
    //3. \D 除了\d之外的其他的任意字符。表示非数字
    //4. \w 等价于[0-9A-Za-z_] 63个字符,表示一个字
    //5. \W 除了\w之外的任意字符,表示非字
    //6. \s 表示一个空格 space
    //7. \S 表示一个非空格
//    val reg = ".".r
//    val reg = "\\d*".r
    // 量词
    // 1. {n,m} 把前面的字符匹配最少n次,最多m次
    // 2. {n, } 把前面的字符匹配最少n次,最多不限
    // 3. {n} 把前面的字符匹配n次
    // 4. ? ===>{0,1}   把前面的字符匹配0次 或者1次
    // 5. + ===>{1, }   把前面的字符匹配最少1次
    // 5. * ===>{0, }   把前面的字符匹配0次 或者多次

    // 1.查找。在目标字符串中,找到符合正则表达式规则要求的 子串
//    val rs = reg.findFirstIn("abc")
//    if(rs.isEmpty){
//      println("你找到的,符合正则表达式要求的内容是",rs.get)
//    }

    //规则1. 有11位
    //规则2. 开头是1
    //规则3. 第二位是3-9的数字
    var reg = "1[3-9]\\d{9}".r
    reg.findAllIn("01234567890 13a12345678 13812345678 and 10987654321 are phone number").toList.foreach(println)
  }
}

案例:

验证用户名是否合法,相关代码如下:

Scala 复制代码
// 验证用户名是否合法
// 规则:
// 1.长度在6-12之间
// 2.不能数字开头
// 3.只能包含数字,大小写字母,下划线
object test {
  def main(args: Array[String]): Unit = {
    val name1 = "1admin"//不合法,是数字开头
    val name2 = "admin1"//合法
    val name3 = "admin"//不合法,长度不够
    val name4 = "ad_123Ab"//合法
    val name5 = "admin123!"//不合法,!是不允许的

    //通过正则表达式来判断
    val reg = "[a-zA-Z_]\\w{5,11}".r // \w = 0-9 a-z A-Z_
    println(reg.matches(name1)) //matches对字符串做验证,返回boolean值
    println(reg.matches(name2)) //matches对字符串做验证,返回boolean值
    println(reg.matches(name3)) //matches对字符串做验证,返回boolean值
    println(reg.matches(name4)) //matches对字符串做验证,返回boolean值
    println(reg.matches(name5)) //matches对字符串做验证,返回boolean值
  }
}

案例:

复制代码
把字符串中的手机号打码,相关代码如下:
Scala 复制代码
//把字符串中的手机号打码:类似于:138****5678
//正则表达式应用场景
//查找,验证,替换
object test2 {
  def main(args: Array[String]): Unit = {
    var str = "张先生,手机号:13812345678 你买的 xxx 到了"
    //开始你的代码
    // 138  1234  5678
//    val reg = "1[3-9]\\d{9}".r
    // () 是分组,它不会影响正则表达式的查询结果,但是,它会把分组找到的内容单独保存在group中
    val reg = "(1[3-9]\\d)(\\d{4})(\\d{4})".r
    //reg.replaceAllIn的功能:在目标字符串str中,用正则表达式reg去查找,找到之后,用 箭头函数 的返回值
    //来替换.

    // m 就是正则表达式找到的内容
    // 如果正则表达式中有(),则可以通过m.group来找到对应的分组
    val newStr = reg.replaceAllIn(str, (m)=>{
      println(s"第一组:${m.group(1)}")
      println(s"第二组:${m.group(2)}")
      println(s"第三组:${m.group(3)}")
      println("-"*40)
      m.group(1) + "****" + m.group(3)
    })
    println(newStr)
    //张先生,手机号:138****5678 你买的 xxx 到了
  }
}
相关推荐
caimouse7 分钟前
ReactOS 窗口系统分析(14):计时器/属性/加速键/热键 — timer.c + prop.c + accelerator.c + hotkey.c
c语言·开发语言·reactos
circuitsosk14 分钟前
Python 模块与包管理:import 机制、虚拟环境与 pip 完全指南
开发语言·python·pip·依赖管理·模块与包
就叫飞六吧14 分钟前
两道门:X-Frame-Options 和 SameSite 到底谁管什么
开发语言·chrome·ai编程
fl17683129 分钟前
基于C#WPF实现的内存加速球清理类似360加速球内存清理
开发语言·c#·wpf
weixin_4407305033 分钟前
python+request实现接口-小结
开发语言·python
不能放弃治疗35 分钟前
上下文压缩机制
后端
QQ_216962909638 分钟前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
凤山老林43 分钟前
高可用服务容错架构:Spring Boot 集成 Resilience4j 实战指南
spring boot·后端·架构·resilience4j
ZJU_统一阿萨姆1 小时前
【算子开发】扫描(Scan)与前缀和
开发语言·arm开发·架构·系统架构·硬件架构
-凌凌漆-1 小时前
【C语言】结构体typedef struct与struct的区别
c语言·开发语言