美文网首页Scala学习
Scala的正则表达式

Scala的正则表达式

作者: xiaogp | 来源:发表于2020-08-30 20:54 被阅读0次

摘要: findFirstIn, findFirstMatchIn, findAllIn, findAllMatchIn, groupreplaceAll

findAllMatchIn配合group匹配指定内容

import scala.util.matching.Regex


def findAllMatchInRegex(): Unit = {
    val str = "今天,华为技术有限公司(以下简称“华为”)和深圳腾讯计算机系统有限公司(以下简称“腾讯”)达成战略合作协议。"
    val keyValPattern: Regex = ".*?[,,。.和与](.*?)(以下简称(.*?)).*?".r
    val findIterator = keyValPattern.findAllMatchIn(str)
    val res = findIterator.map(x => (x.group(1), x.group(2))).toList
    println(res) // List((华为技术有限公司,“华为”), (深圳腾讯计算机系统有限公司,“腾讯”))

    // 如果匹配不到
    println(res.isEmpty) // true

    //    val findIterator = keyValPattern.findAllMatchIn(str)
    //    val collect = ListBuffer[List[String]]()
    //    findIterator.foreach(x => collect.append(List(x.group(1), x.group(2))))
    //    println(collect)
  }

findFirstMatchIn, findFirstIn的区别

findFirst如果带有Match,返回的是一个Match对象,Match对象可以进一步结合group操作,如果不带直接返回String

/**
   * findFirstMatchIn和findFirstIn的区别
   * findFirstIn返回Some(String)匹配到的字符串
   * findFirstMatchIn返回Some[Match]对象,可以继续group操作
   */
  def findFirstInRegex(): Unit = {
    val str = "今天是2020年8月30日,天气晴,风向东南,风力3级。"
    //三个双引号为自然语言不用\转义
    val date = """今天是(\d+年\d+月\d+日)""".r
    //    val date = "今天是(\\d+年\\d+月\\d+日)".r

    val res1 = date.findFirstIn(str).getOrElse(null)
    println(res1.getClass) // String
    println(res1 == "今天是2020年8月30日") // true

    // 采用模式匹配
    val res2 = date.findFirstIn(str) match {
      case Some(s) => s
      case None => null
    }
    println(res2) // 今天是2020年8月30日

    // findFirstMatchIn使用group
    val res3 = date.findFirstMatchIn(str)
    println(res3.get.group(1)) // 2020年8月30日
    println(res3) // Some(今天是2020年8月30日)

  }

findAllMatchIn, findAllIn的区别

findAll如果带有Match,返回的是一个iterator[Match]对象,Match对象可以进一步结合group操作,如果不带直接返回iterator[String]

/**
   * findAllIn返回iterator[String]对象
   * findAllMatchIn返回iterator[Match]对象,可以对每一个Match对象group
   */
  def findAllInRegex(): Unit = {
    val str = "aaabc123abc321abcaa"
    val regex: Regex = """abc(\d+)abc""".r
    val res1 = regex.findAllIn(str)
    println(res1.getClass) // scala.util.matching.Regex$MatchIterator
    for (elem <- res1) {
      println(elem) // abc123abc
      println(elem.getClass) // java.lang.String
    }

    val res2 = regex.findAllMatchIn(str)
    for (elem <- res2) {
      println(elem)
      println(elem.getClass)  // scala.util.matching.Regex$Match 对象
      println(elem.group(1))  // 123
      println(elem.group(1).getClass)  // java.lang.String
    }
  }

模式匹配条件判断

可以使用findFirstIn,findAllIn对匹配结果进行判断,是否为空作为后续程序的执行依据

 /**
   * 模式匹配条件判断
   */
  def isMatch(): Unit = {
    val regex: Regex = """.*?中.*?国.*?""".r
    val str1 = "中华人民共和国"
    val str2 = "中央政府"

    // 使用findFirstIn返回一个Option
    if (regex.findFirstIn(str2) match {
      case Some(_) => true
      case None => false
    }) {
      println("do something") // bu do
    }
    // 使用findAllIn返回一个iterator的match对象
    if (regex.findAllIn(str1).nonEmpty) {
      println("do something") // do something
    }
  }

其他一些常用的正则表达式

去除文本中的非中文,使用replaceAll调用正则表达式[^\u4e00-\u9fa5]非中文

scala> "我们是中国人aaE(?吗)-=~?,×123是的".replaceAll("[^\u4e00-\u9fa5]", "")
res3: String = 我们是中国人吗是的

相关文章

网友评论

    本文标题:Scala的正则表达式

    本文链接:https://www.haomeiwen.com/subject/tqaesktx.html