正则表达式

前面我们学习了文件匹配相关的内容,其中在做单词调频统计的时侠,用到了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) } } ``` ![3d53d1083edb426293e94d7762e5d6ae.jpeg](https://i-blog.csdnimg.cn/direct/3d53d1083edb426293e94d7762e5d6ae.jpeg) ![1c84994f3af44077815b125a070c9c00.jpeg](https://i-blog.csdnimg.cn/direct/1c84994f3af44077815b125a070c9c00.jpeg) 案例: 验证用户名是否合法,相关代码如下: ```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值 } } ``` 案例: ``` 把字符串中的手机号打码,相关代码如下: ``` ![](https://i-blog.csdnimg.cn/direct/63ab1d8d273c4f5f8a94a4e576eb197e.jpeg) ```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 到了 } } ```

相关推荐
巨人张8 分钟前
信息素养Python编程题
开发语言·python
志辉AI编程30 分钟前
别人还在入门,你已经精通!Claude Code进阶必备14招
后端·ai编程
阿猿收手吧!32 分钟前
【计算机网络】HTTP1.0 HTTP1.1 HTTP2.0 QUIC HTTP3 究极总结
开发语言·计算机网络
JAVA学习通33 分钟前
图书管理系统(完结版)
java·开发语言
代码老y38 分钟前
Spring Boot项目中大文件上传的高级实践与性能优化
spring boot·后端·性能优化
paishishaba40 分钟前
处理Web请求路径参数
java·开发语言·后端
七七七七0741 分钟前
C++类对象多态底层原理及扩展问题
开发语言·c++
程序无bug44 分钟前
Java中的8中基本数据类型转换
java·后端
雨落倾城夏未凉1 小时前
8.Qt文件操作
c++·后端·qt