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(_))

浙公网安备 33010602011771号