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 "。 |
正規表示式實例
實例 | #描述 |
---|---|
. | 符合除"\r\n"之外的任何單一字元。 |
[Rr]uby | #匹配"Ruby" 或"ruby" |
rub[ye] | 匹配"ruby" 或"rube" |
[aeiou] | 匹配小寫字母:aeiou |
符合任何數字,類似[0123456789] | |
符合任何ASCII 小寫字母 | |
匹配任何ASCII 大寫字母 | |
匹配數字,大小寫字母 | |
匹配除了aeiou 其他字元 | |
符合除了數字的其他字元 | |
符合數字,類似: [0-9] | |
匹配非數字,類似: [^0-9] | |
匹配空格,類似: [ \t \r\n\f] | |
符合非空格,類似: [^ \t\r\n\f] | |
匹配字母,數字,底線,類似: [A-Za-z0-9_] | |
符合非字母,數字,底線,類似: [^A-Za-z0-9_] | |
匹配"rub" 或"ruby": y 是可選的 | |
#匹配"rub" 加上0 個或多個的y。 | |
符合 "rub" 加上 1 個或多個的 y。 | |
#剛好符合 3 個數字。 | |
符合 3 個或多個數字。 | |
符合 3 個、4 個或 5 個數字。 | |
無分組: + 重複\d | |
分組: + 重複\D\d 對 | |
匹配"Ruby" 、"Ruby, ruby, ruby",等等 |
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