正則表達式
Scala 通過 scala.util.matching 包種的 Regex 類來支持正則表達式
scala.util.matching.Regex.構造一個Regex對象,用String類的r方法:
val numPattern = “[0-9]+”.r
如果正則表達式包含反斜杠或引號的話,最好使用“原始”字符串語法”””…”””,例如:
val wsnumwsPattern = “””\s+[0-9]+\s+”””.r
findAllIn方法返回遍歷所有匹配項的迭代器。可以在for循環中使用它:
for( matching <- numPattern.findAllIn(“99 bottles,98 bottles”))
處理 matchString或者將迭代器轉成數組:
val matches = numPattern.findAllIn(“99 bottles,98 bottles”)) //Array(99,98)
要找到字符串中的首個匹配項,可使用findFirstIn,得到Option[String].
val m1 = wsnumwsPattern.findFirstIn(“99 bottles,98 bottles”)) //Some(“98”)
檢查是否某個字符串的開始部分能匹配,可用findPrefixOf,可以替換首個匹配項或全部替換,使用replaceFirstIn,replaceAllIn.
正則表達式組
val numitemPattern = “([0-9]+) ([a-z]+)”.r
val numitemPattern(num,item) = “99 bottles”//將num設為99,item設為bottles
從多個匹配項中提取分組內容:
for(numitemPattern(num,item) <- numitemPattern.findAllIn(“99 bottles,98 bottles”))
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"。 |