Scala 正则表达式

  • 正则表达式

    本章说明Scala如何通过scala.util.matching包中提供的Regex类支持正则表达式。尝试下面的示例程序,我们将尝试从语句中找出单词"Scala"。
    
    import scala.util.matching.Regex
    
    object Demo {
       def main(args: Array[String]) = {
          val pattern = "Scala".r
          val str = "Scala is Scalable and cool"
          
          println(pattern findFirstIn str)
       }
    }
    
    尝试一下
    输出-
    
    Some(Scala)
    
    我们创建一个字符串,并在其上调用r()方法。Scala隐式地将String转换为RichString并调用该方法以获取Regex的实例。要查找正则表达式的第一个匹配项,只需调用findFirstIn()方法。如果我们想查找匹配词的所有匹配项而不是仅查找第一次出现的匹配项,可以使用findAllIn()方法,并且如果目标字符串中有多个Scala单词可用,则将返回所有匹配项的集合话。您可以使用mkString()方法来连接结果列表,并且可以使用管道(|)搜索Scala的小写字母,也可以使用Regex构造函数或r()方法来创建模式。请尝试以下示例程序。
    
    import scala.util.matching.Regex
    
    object Demo {
       def main(args: Array[String]) = {
          val pattern = new Regex("(S|s)cala")
          val str = "Scala is scalable and cool"
          
          println((pattern findAllIn str).mkString(","))
       }
    }
    
    尝试一下
    输出-
    
    Scala,scala
    
    如果您想替换匹配的文本,我们可以使用replaceFirstIn()替换第一个匹配项,或者使用replaceAllIn()替换所有匹配项。
    
    object Demo {
       def main(args: Array[String]) = {
          val pattern = "(S|s)cala".r
          val str = "Scala is scalable and cool"
          
          println(pattern replaceFirstIn(str, "Java"))
       }
    }
    
    尝试一下
    输出:
    
    Java is scalable and cool
    
  • 形成正则表达式

    Scala继承了Java的正则表达式语法,而Java又继承了Perl的大部分特性。这里只是一些例子,作为复习,应该足够了下面的表格列出了Java中可用的所有正则表达式元字符语法。
    子表达式 匹配
    ^ 匹配行首。
    $ 匹配行尾。
    . 匹配除换行符以外的任何单个字符。使用m选项还可以使其与换行符匹配。
    [...] 匹配括号中的任何单个字符。
    [^...] 匹配括号中没有的任何单个字符
    \\A 整个字符串的开头
    \\z 整个字符串的结尾
    \\Z 整个字符串的结尾,但允许的最后一行终止符除外。
    re* 匹配0个或多个出现的前一个表达式。
    re+ 匹配1个或多个前一个
    re? 匹配0或1个出现的前一个表达式。
    re{ n} 精确匹配前一个表达式的n次出现。
    re{ n,} 匹配n个或多个出现的前一个表达式。
    re{ n, m} 至少匹配n个,最多匹配m个先前的表达式。
    a|b 匹配a或b。
    (re) 对正则表达式进行分组并记住匹配的文本。
    (?: re) 对正则表达式进行分组,而无需记住匹配的文本。
    (?> re) 匹配独立模式而无需回溯。
    \\w 匹配单词字符。
    \\W 匹配非单词字符。
    \\s 匹配空格。等效于[\t\n\r\f]。
    \\S 匹配非空格。
    \\d 匹配数字。相当于[0-9]。
    \\D 匹配非数字。
    \\A 匹配字符串的开头。
    \\Z 匹配字符串的结尾。如果存在换行符,则匹配换行符。
    \\z 匹配字符串的结尾。
    \\G 比赛结束点。
    \\n 向后引用捕获组号“ n”
    \\b 在方括号外时匹配单词边界。放在方括号内时,匹配退格键(0x08)。
    \\B 匹配非单词边界。
    \\n, \\t, etc. 匹配换行符,回车符,制表符等。
    \\Q 引号所有字符,直到\\E
    \\E 以\\Q开头的结束符
  • 正则表达式示例

    例子 描述
    . 匹配除换行符以外的任何字符
    [Rr]uby 匹配“Ruby”或“ruby”
    rub[ye] 匹配“ruby”或“rube”
    [aeiou] 匹配任何一个小写的元音字母
    [0-9] 匹配任意数字; 与[0123456789]相同
    [a-z] 匹配任何小写ASCII字母
    [A-Z] 匹配任何大写ASCII字母
    [a-zA-Z0-9] 符合以上任何条件
    [^aeiou] 匹配小写元音字母以外的其他任何东西
    [^0-9] 匹配数字以外的任何东西
    \\d 匹配数字:[0-9]
    \\D 匹配一个非数字:[^ 0-9]
    \\s 匹配空格字符:[\t\r\n\f]
    \\S 匹配非空格:[^\t\r\n\f]
    \\w 匹配一个单词字符:[A-Za-z0-9_]
    \\W 匹配一个非单词字符:[^A-Za-z0-9_]
    ruby? 匹配“rub”或“ruby”:y是可选的
    ruby* 匹配“rub”加上0个或多个y
    ruby+ 匹配“rub”加上1个或多个y
    \\d{3} 精确匹配3位数字
    \\d{3,} 匹配3个或更多数字
    \\d{3,5} 匹配3、4或5位数字
    \\D\\d+ 无群组:+重复\\d
    (\\D\\d)+/ 分组:+重复\\D\d对
    ([Rr]uby(, )?)+ 匹配“Ruby”,“Ruby,ruby,ruby”等。
    注意-每个反斜杠在上面的字符串中出现两次。 这是因为在Java和Scala中,单个反斜杠是字符串文字中的转义字符,而不是出现在字符串中的常规字符。 因此,您需要编写“\\”来代替字符串中的单个反斜杠,而不是“\”。
    请尝试以下示例程序。
    
    import scala.util.matching.Regex
    
    object Demo {
       def main(args: Array[String]) = {
          val pattern = new Regex("abl[ae]\\d+")
          val str = "ablaw is able1 and cool"
          
          println((pattern findAllIn str).mkString(","))
       }
    }
    
    尝试一下
    输出-
    
    able1