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 語言的規則。

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

<td重複n次或更多次< td="">

表達式符合規則
^ 符合輸入字串開始的位置。
$符合輸入字串結尾的位置。
.符合"\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 "。

正規表示式實例

##[0 -9]符合任何數字,類似[0123456789][a-z]符合任何ASCII 小寫字母#[A-Z]匹配任何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​​",等等
實例#描述
.符合除"\r\n"之外的任何單一字元。
[Rr]uby#匹配"Ruby" 或"ruby"
rub[ye]匹配"ruby" 或"rube"
[aeiou]匹配小寫字母:aeiou
#注意上表中的每個字元使用了兩個反斜線。這是因為在 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