Latest web development tutorials

Scala 正則表達式

Scala通過scala.util.matching包種的Regex類來支持正則表達式。 以下實例演示了使用正則表達式查找單詞Scala :

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
Some(Scala)

實例中使用String 類的r() 方法構造了一個Regex對象。

然後使用findFirstIn 方法找到首個匹配項。

如果需要查看所有的匹配項可以使用findAllIn 方法。

你可以使用mkString( ) 方法來連接正則表達式匹配結果的字符串,並可以使用管道(|)來設置不同的模式:

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // 首字母可以是大写 S 或小写 s
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))   // 使用逗号 , 连接返回结果
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
Scala,scala

如果你需要將匹配的文本替換為指定的關鍵詞,可以使用replaceFirstIn( )方法來替換第一個匹配項,使用replaceAllIn( )方法替換所有匹配項,實例如下:

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

正則表達式

Scala 的正則表達式繼承了Java 的語法規則,Java 則大部分使用了Perl 語言的規則。

下表我們給出了常用的一些正則表達式規則:

表達式 匹配規則
^ 匹配輸入字符串開始的位置。
$ 匹配輸入字符串結尾的位置。
. 匹配除"\r\n"之外的任何單個字符。
[...] 字符集。 匹配包含的任一字符。 例如,"[abc]"匹配"plain"中的"a"。
[^...] 反向字符集。 匹配未包含的任何字符。 例如,"[^abc]"匹配"plain"中"p","l","i","n"。
\\A 匹配輸入字符串開始的位置(無多行支持)
\\z 字符串結尾(類似$,但不受處理多行選項的影響)
\\Z 字符串結尾或行尾(不受處理多行選項的影響)
re* 重複零次或更多次
re+ 重複一次或更多次
re? 重複零次或一次
re{ n} 重複n次
re{ n,}
re{ n, m} 重複n到m次
a|b 匹配a 或者b
(re) 匹配re,並捕獲文本到自動命名的組裡
(?: re) 匹配re,不捕獲匹配的文本,也不給此分組分配組號
(?> re) 貪婪子表達式
\\w 匹配字母或數字或下劃線或漢字
\\W 匹配任意不是字母,數字,下劃線,漢字的字符
\\s 匹配任意的空白符,相等於[\t\n\r\f]
\\S 匹配任意不是空白符的字符
\\d 匹配數字,類似[0-9]
\\D 匹配任意非數字的字符
\\G 當前搜索的開頭
\\n 換行符
\\b 通常是單詞分界位置,但如果在字符類裡使用代表退格
\\B 匹配不是單詞開頭或結束的位置
\\t 製表符
\\Q 開始引號:\Q(a+b)*3\E可匹配文本"(a+b)*3"。
\\E 結束引號:\Q(a+b)*3\E可匹配文本"(a+b)*3"。

正則表達式實例

實例 描述
. 匹配除"\r\n"之外的任何單個字符。
[Rr]uby 匹配"Ruby" 或"ruby"
rub[ye] 匹配"ruby" 或"rube"
[aeiou] 匹配小寫字母:aeiou
[0-9] 匹配任何數字,類似[0123456789]
[az] 匹配任何ASCII 小寫字母
[AZ] 匹配任何ASCII 大寫字母
[a-zA-Z0-9] 匹配數字,大小寫字母
[^aeiou] 匹配除了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 Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
able1