zoukankan      html  css  js  c++  java
  • 关于Scala中正则表达式的几种用法

    正则表达式是一种针对于字符串的操作,主要功能有匹配、切割、替换和获取的作用,在Scala中正则也是被频繁使用的方法(regex.r表示为正则表达式)

    1、匹配

    Scala支持多种正则表达式解析,主要包括下面三种:

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

    //String.matches

    val a = "studying83"
    println(a.matches("[a-z0-9]+")) //true
    println(a.matches("[a-z0-9]{4}"))//false

    //正则表达式模式匹配

    val b = """([a-z0-9]+)"""".r
    "studying83" match {
        case b => println("匹配成功")
        case _ => println("匹配失败")
    }
    //匹配成功

    //scala.util.matching.Regex API

    其中有三种匹配:

      findFirstMatchIn()返回第一个匹配(Option[match])

      findAllMatchIn()返回所有匹配(regex.match)

      findAllIn()返回所有匹配结果(String)

    //findFirstMatchIn()
    val reg = "[0-9]".r
    reg.findFirstMatchIn("abc3d2gf") match { 
        case Some(x) => println(x)  
        case None => println("no")
    }   //3
    
    //findAllMatchIn()
    val reg = "[0-9]".r
    println(reg.findAllMatchIn("abc3d2gf").toList)
    //List(3, 2)

    2、捕获分组

    val str =  "{"id":"123456","friends":{"name":"zs","age":"40"}}"
    val reg = "\{"id":"([0-9]+)","friends":\{"name":"([a-z]+)","age":"([0-9]+)"}}".r
    reg.findAllMatchIn(str).foreach(x=>println(x.group(1),x.group(2),x.group(3)))
    //(123456,zs,40)
    
    val input="name:Jason,age:19,weight:100"
    val studentPattern="([0-9a-zA-Z-#() ]+):([0-9a-zA-Z-#() ]+)".r
    studentPattern.findAllMatchIn(input).foreach(x=>println(x.group(1),x.group(2)))
    //(name,Jason)
    (age,19)
    (weight,100)
    
    //实用性 例如某一日志文件内容如:INFO 2000-01-07 requestURI:/c?app=0&p=1 路径为path 对其进行解析
    import scala.io.Source
    val source = Source.fromFile("path","UTF-8")
    val lines = source.getLines.toArray
    val reg = """([A-Z]+) ([0-9]{4}-[0-9]{2}-[0-9]{1,2}) requestURI:(.*)""".r
    1## lines.map(line => reg.findAllMatchIn(line).toList.map(x => (x.group(1),x.group(2),x.group(3)))).foreach(println)
    //List((INFO,2020-01-07,/c?app=0&p=1))
    2## lines.map(line => line match{case reg(le,ld,ad) => (le,ld,ad)})
    // Array[(String)] = Array((INFO,2000-01-07,/c?app=0&p=1))

    3、替换

    //replaceFirstIn
    val a = """([0-9]+)""".r
    a.replaceFirstIn("123,go! 666","run")
    // run,go! 666
    
    //replaceAllIn
    val a = """([0-9]+)""".r
    a.replaceAllIn("123 you are the best!","come on!")
    //come on! you are the best!

    4、查找

    val date = """([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})""".r
    "2020-5-18" match {case date(year, _*) => println((year))}
    //2020
    "2020-5-18" match {case date(_,mon,_*) => println(mon)}
    //5
  • 相关阅读:
    PHP 表单
    php之表单-2(表单验证)
    go语言使用官方的 log package 来记录日志
    golang 中timer,ticker 的使用
    go语言slice的理解
    GETTING STARTED WITH THE OTTO JAVASCRIPT INTERPRETER
    golang time.Duration()的问题解疑
    css3动画
    【转】golang中的并行与并发
    【转】Golang 关于通道 Chan 详解
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13690573.html
Copyright © 2011-2022 走看看