摘要: findFirstIn
, findFirstMatchIn
, findAllIn
, findAllMatchIn
, group
,replaceAll
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 = 我们是中国人吗是的
网友评论