Scala正则表达式

Scala正则表达式-1

Scala支持多种正则表达式解析方式

  • String.matches()方法
  • 正则表达式模式匹配
  • scala.util.matching.Regex API

String.matches

"!123".matches("[a-zA-Z0-9]{4}")    //false
"34Az".matches("[a-zA-Z0-9]{4}")    //true

模式匹配,Regex实现了提取器

val ZipcodePattern = "([a-zA-Z][0-9][a-zA-Z][0-9])".r    //使用".r"方法可使任意字符串变成一个Regex实例
"L3R 6M2" match{
    case ZipcodePattern(zc) => println("Valid zip-code:" +zc)//zc为第一个分组结果,可以匹配多个分组
    case zc => println("Invalid zip-code:" +zc)
}

如何理解zc为第一个分组结果,可以匹配多个分组?

val ZipcodePattern = "([a-zA-Z])([0-9])([a-zA-Z]) ([0-9])".r
"L3R 6" match{
    case ZipcodePattern(x,y,z,k) => println(x+y+z+k)
    case x => println("Invalid zip-code:" +x)
}

Scala正则表达式-2

Scala.util.matching.Regex

  • findFirstMatchIn() 返回第一个匹配(Option[Match])
  • findAllMatchIn() 返回所有匹配结果(Regex.Match)
  • findAllIn() 返回所有匹配结果(String)
import scala.util.matching.Regex
val reg = "[0-9]".r
reg.findFirstMatchIn("abcd1dfd") match {
    case Some(_) => println("ok")
    case None => println("no")
}

获取第一个匹配的结果

reg.findFirstMatchIn("abcd1dfd") match {
    case Some(x) => println("x")
    case None => println("no")
}

获取所有匹配的结果

reg.findAllMatchIn("abcd1d2f4d").toList//应用:与组有关
reg.findAllIn("abcd1d2f4d").toList//应用:常用

Scala正则表达式-3

捕获分组
识别{"id":"123456","friends":{"name":"zs","age":"40"}}的键值对

import scala.util.matching.Regex
val reg = "\\{\"id\":\"([0-9]+)\",\"friends\":\\{\"name\":\"([a-z]+)\",\"age\":\"([0-9]+)\"}}".r
val str="{\"id\":\"123456\",\"friends\":{\"name\":\"zs\",\"age\":\"40\"}}"
reg.findAllMatchIn(str).toList
reg.findAllMatchIn(str).foreach(x=>println(x.group(1),x.group(2),x.group(3)))

Scala正则表达式-4

字符串替换
search

val nums = "[0-9]+".r.findAllln("123 Main Street Suite 2012")
nums.next    //->123
nums.next    //->2012

replace

"[0-9]+".r.replaceFirstIn("234 Main Street Suite 2034","567")    //234->567
"[0-9]+".r.replaceAllIn("234 Main Street Suite 2034","567")    //234、234->567

Scala正则表达式-5

在字符串中查找模式

val d= """([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})""".r
"2014-5-18" match{
    case d(_,mon,_*) => println(mon)
}

_*除前面的其他忽略
regex里三个""",就不需要转义了!

scala读文件

import scala.io.Source
var source = Source.fromFile("E:/scala/test.txt","UTF-8")
var lines = source.getLines.toArray
val reg = """([A-Z]+) ([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}) requestURI:(.*)""".r
//法一
lines.map(line=>line match{
case reg(level,logdate,addr)=>(level,logdate,addr)
case _=>""
})
lines.filter(_.matches("([A-Z]+) ([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}) requestURI:(.*)")
//法二
lines.filter(_.matches("""([A-Z]+) ([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}) requestURI:(.*)""")).map(line=>line match{
      case reg(level,logdate,addr)=>(level,logdate,addr)
}).foreach(println(_))
posted @ 2020-09-17 16:49  清和一十六  阅读(559)  评论(0)    收藏  举报