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] |
| [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",等等 |
注意上表中的每個字元使用了兩個反斜線。這是因為在 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
