正则表达式

打印 上一主题 下一主题

主题 777|帖子 777|积分 2331

  前面我们学习了文件匹配相干的内容,其中在做单词调频统计的时侠,用到了IW+这个内容,当时没有展开来介绍。本日花一节课的时间,我们来学习一下正则表达式。
1.正则表达式的界说
  正则表达式(Regular Expression)是一种用一匹配、查找和替换文本中特定模式的字符串。
  它是一种强盛的文本处理工具,通过界说一系列的字符和操作符组合来描述这些模式。简朴来说,它就像是一种文本模式的“配方”,可以让计真机根据这个“配方” 在文本中找到符合要求的内容。
第一个正则表达式的案例如下:
  1. object test {
  2.   def main(args: Array[String]): Unit = {
  3.     //定义一个规则 正则表达式
  4.     val reg = "[123]".r
  5.     // 1.查找。在目标字符串中,找到符合正则表达式规则要求的 子串
  6. //    val rs = reg.findFirstIn("abc")
  7. //    if(rs.isEmpty){
  8. //      println("你找到的,符合正则表达式要求的内容是",rs.get)
  9. //    }
  10.     reg.findAllIn("1a 2bc a3b").toList.foreach(println)
  11.   }
  12. }
复制代码
案例: 
  1:明确匹配手机号码首位数字“1”,契合国内手机号起始数字规范。 
  [3-9]:字符类设定,限定手机号第二位数字取值在“3”至“9”这个区间内,筛除不符合运营商号段分配起始数字规律的值。 
  \\d{9}:\\d代表数字字符(等同于[0-9]),[9]量词修饰,表明需紧接着匹配连续9个数字,对应手机号陈去前两位固定格式外的后续数字部门。
  1. object test {
  2.   def main(args: Array[String]): Unit = {
  3. //    println("a\tb")
  4.     //定义一个规则 正则表达式
  5. //    val reg = "[a-zA-Z0-9]".r
  6. //    val reg = "^a$".r
  7.     //1. . 表示 除了换行之外的其他的任意单个字符
  8.     //2. \d 等于[0-9] 匹配一个数字
  9.     //3. \D 除了\d之外的其他的任意字符。表示非数字
  10.     //4. \w 等价于[0-9A-Za-z_] 63个字符,表示一个字
  11.     //5. \W 除了\w之外的任意字符,表示非字
  12.     //6. \s 表示一个空格 space
  13.     //7. \S 表示一个非空格
  14. //    val reg = ".".r
  15. //    val reg = "\\d*".r
  16.     // 量词
  17.     // 1. {n,m} 把前面的字符匹配最少n次,最多m次
  18.     // 2. {n, } 把前面的字符匹配最少n次,最多不限
  19.     // 3. {n} 把前面的字符匹配n次
  20.     // 4. ? ===>{0,1}   把前面的字符匹配0次 或者1次
  21.     // 5. + ===>{1, }   把前面的字符匹配最少1次
  22.     // 5. * ===>{0, }   把前面的字符匹配0次 或者多次
  23.     // 1.查找。在目标字符串中,找到符合正则表达式规则要求的 子串
  24. //    val rs = reg.findFirstIn("abc")
  25. //    if(rs.isEmpty){
  26. //      println("你找到的,符合正则表达式要求的内容是",rs.get)
  27. //    }
  28.     //规则1. 有11位
  29.     //规则2. 开头是1
  30.     //规则3. 第二位是3-9的数字
  31.     var reg = "1[3-9]\\d{9}".r
  32.     reg.findAllIn("01234567890 13a12345678 13812345678 and 10987654321 are phone number").toList.foreach(println)
  33.   }
  34. }
复制代码


案例:
验证用户名是否合法,相干代码如下:
  1. // 验证用户名是否合法
  2. // 规则:
  3. // 1.长度在6-12之间
  4. // 2.不能数字开头
  5. // 3.只能包含数字,大小写字母,下划线
  6. object test {
  7.   def main(args: Array[String]): Unit = {
  8.     val name1 = "1admin"//不合法,是数字开头
  9.     val name2 = "admin1"//合法
  10.     val name3 = "admin"//不合法,长度不够
  11.     val name4 = "ad_123Ab"//合法
  12.     val name5 = "admin123!"//不合法,!是不允许的
  13.     //通过正则表达式来判断
  14.     val reg = "[a-zA-Z_]\\w{5,11}".r // \w = 0-9 a-z A-Z_
  15.     println(reg.matches(name1)) //matches对字符串做验证,返回boolean值
  16.     println(reg.matches(name2)) //matches对字符串做验证,返回boolean值
  17.     println(reg.matches(name3)) //matches对字符串做验证,返回boolean值
  18.     println(reg.matches(name4)) //matches对字符串做验证,返回boolean值
  19.     println(reg.matches(name5)) //matches对字符串做验证,返回boolean值
  20.   }
  21. }
复制代码
 案例:
  1. 把字符串中的手机号打码,相关代码如下:
复制代码

  1. //把字符串中的手机号打码:类似于:138****5678
  2. //正则表达式应用场景
  3. //查找,验证,替换
  4. object test2 {
  5.   def main(args: Array[String]): Unit = {
  6.     var str = "张先生,手机号:13812345678 你买的 xxx 到了"
  7.     //开始你的代码
  8.     // 138  1234  5678
  9. //    val reg = "1[3-9]\\d{9}".r
  10.     // () 是分组,它不会影响正则表达式的查询结果,但是,它会把分组找到的内容单独保存在group中
  11.     val reg = "(1[3-9]\\d)(\\d{4})(\\d{4})".r
  12.     //reg.replaceAllIn的功能:在目标字符串str中,用正则表达式reg去查找,找到之后,用 箭头函数 的返回值
  13.     //来替换.
  14.     // m 就是正则表达式找到的内容
  15.     // 如果正则表达式中有(),则可以通过m.group来找到对应的分组
  16.     val newStr = reg.replaceAllIn(str, (m)=>{
  17.       println(s"第一组:${m.group(1)}")
  18.       println(s"第二组:${m.group(2)}")
  19.       println(s"第三组:${m.group(3)}")
  20.       println("-"*40)
  21.       m.group(1) + "****" + m.group(3)
  22.     })
  23.     println(newStr)
  24.     //张先生,手机号:138****5678 你买的 xxx 到了
  25.   }
  26. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表