scala 正则超详细总结!!!

本文详述了Scala中的正则表达式使用,包括String.matches()方法、正则表达式模式匹配、scala.util.matching.Regex类的功能,如findFirstMatchIn()、findAllMatchIn()和replaceAllIn()。此外,还涵盖了捕获分组、字符串替换和在字符串中查找模式的实例应用。

一、scala正则表达式-1
Scala支持多种正则表达式解析方式
(1)String.matches()方法
例:

var a = "!123".matches("[a-zA-Z0-9]{4}")
println(a)
结果:false

(2)正则表达式模式匹配

var source = Source.fromFile("D:\\wcl.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.filter(_.matches("([A-Z]+) ([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}) requestURI:(.*)"))
lines.map(line=>line match {case reg(le,ld,ad)=>(le,ld,ad) case _ => ""})
结果:res33: Array[java.io.Serializable] = Array((INFO,2000-01-07,/c?app=0&p=1), (INFO,2000-02-07,/c?app=1&p=2), (DEBUG,2002-02-04,/c?app=2&p=3), (INFO,2003-11-14,/c?app=3&p=4), (ERROR,2004-12-07,/c?app=4&p=5))

(3)scala.util.matching.Regex

二、正则表达式-2
scala.util.matching.Regex
(1)findFirstMatchLn()返回第一个匹配(Option【Match】)
(2)findAllMatchLn()返回所有匹配结果(Regex.Match)分组时调用
(3)findAllLn()返回所有匹配结果(String)推荐使用

var reg = "[0-9]".r
var a = reg.findFirstMatchIn("acsddsg12dvs") match {
  case Some(_) => println("OK")
  case None => println("no")
}

三、正则表达式-3
捕获分组(group,见下方完整案例)
四、正则表达式-4
字符串替换(replaceFirstLn replaceAllLn)

val num = "[0-9]+".r.findAllIn("123 main street suite 2019").foreach(println(_))
"[0-9]+".r.replaceAllIn("123 main street suite 2019","333").foreach(print(_))

五、正则表达式-5
在字符串中查找模式

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

六、详细完整案例

    var a = "!123".matches("[a-zA-Z0-9]{4}")
    println(a)
    //正则读有效数据
    //read data
    var source = Source.fromFile("D:\\test.txt","UTF-8")
    var lines = source.getLines().toArray
    //regexp  \u4e00-\u9fa5
    //125;男;2015-9-7 1:52:22;1521.84
    val reg = """([0-9]{2,3});([\u4e00-\u9fa5]);([0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2});([0-9]{3,4}.[0-9]{2})""".r
    var regStrTest = "([0-9]{2,3});([\u4e00-\u9fa5]);([0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2});([0-9]{3,4}.[0-9]{2})"
    var line2 = lines.filter(_.matches(regStrTest))//清理数据
    line2.map(line=>line match{case reg(id,sex,date,money)=>(id,money)}).foreach(println(_))
    line2.map(line=>reg.findAllMatchIn(line).toList.map(x=>(x.group(1),x.group(2),x.group(3),x.group(4)))).foreach(println(_))
    line2.map(line=>reg.findAllMatchIn(line).foreach(x=>println(x.group(1),x.group(2),x.group(3),x.group(4))))

法一结果:
在这里插入图片描述

法二结果:
在这里插入图片描述

法三结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值