Scala正則表達式
Scala支持通過Regex類的scala.util.matching封裝正則表達式。讓我們看看一個例子,我們將嘗試從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) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Some(Scala) C:/>
我們創建一個字符串,並調用r()方法就可以了。Scala中字符串隱式轉換為一個RichString並調用該方法來獲得正則表達式的一個實例。找到第一個正則表達式匹配,隻需調用findFirstIn()方法。而非隻找到第一次出現。如果想找到匹配的單詞的所有事件,可以使用findAllIn()方法,並在情況下,有目標字符串中使用多個Scala的單詞,這將返回所有匹配的集合單詞。
可以使用mkString()方法來連接所產生的服務,可以使用管道(|)搜索Scala中小型和資本的情況下,使用正則表達式構造來代替或r()方法創建一個模式如下:
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = new Regex("(S|s)cala") val str = "Scala is scalable and cool" println((pattern findAllIn str).mkString(",")) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Scala,scala C:/>
如果想更換匹配的文本,可以使用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")) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test Java is scalable and cool C:/>
形成正則表達式:
Scala繼承了Java,這反過來又繼承了大部分的Perl的功能,它的正則表達式語法。這裡隻是一些例子,應該是足夠的說明:
下麵是表,列出了所有的正則表達式元字符的語法可用在Java中:
子表達式 | 匹配 |
---|---|
^ | 匹配行頭 |
$ | 匹配行尾 |
. | 匹配除換行符任何單個字符。用m選項也允許使之匹配換行符。 |
[...] | 匹配括號內任何單個字符。 |
[^...] | 匹配任何單個字符不是在括號中 |
\A | 整個字符串的開始 |
\z | 整個字符串結束 |
\Z | 最終,除了允許的最後行結束整個字符串。 |
re* | 匹配0或多次出現前麵表達式。 |
re+ | 匹配1個或多個的先前東西 |
re? | 匹配0或1發生前表達式。 |
re{ n} | 精確匹配n個前麵表達式的數量。 |
re{ n,} | 匹配n或多次出現前麵的表達。 |
re{ n, m} | 至少匹配n和在前麵的表現最為m次出現。 |
a|b | 匹配a或b。 |
(re) | 組正則表達式並記住匹配的文本。 |
(?: re) | 組正則表達式而不記住匹配的文本。 |
(?> re) | 匹配獨立模式而不反向追蹤。 |
\w | 匹配單詞字符。 |
\W | 匹配非單詞字符。 |
\s | 匹配空白。相當於 [ f]. |
\S | 匹配非空白。 |
\d | 匹配數字。相當於 [0-9]. |
\D | 匹配非數字。 |
\A | 匹配開始的字符串。 |
\Z | 匹配字符串的結尾。如果一個換行符存在,它隻是換行之前匹配。 |
\z | 匹配字符串的結尾。 |
\G | 匹配點,最後一次匹配結束。 |
\n | 反向引用以捕獲組編號 "n" |
\b | 匹配單詞邊界之外時,括號內。匹配退格(0×08)括號裡麵。 |
\B | 匹配非單詞邊界。 |
\n, \t, etc. | 匹配換行符,回車,製表符等 |
\Q | 轉義(引用)所有字符為 \E |
\E | 尾部引用開始 \Q |
正則表達式的例子:
示例 | 描述 |
---|---|
. | 匹配除了換行符的任何字符 |
[Rr]uby | 匹配 "Ruby" 或"ruby" |
rub[ye] | 匹配"ruby" 或 "rube" |
[aeiou] | 匹配任何一個小寫元音 |
[0-9] | 匹配任何數字;同 [0123456789] |
[a-z] | 匹配任意小寫ASCII字母 |
[A-Z] | 匹配任意大寫ASCII字母 |
[a-zA-Z0-9] | 匹配任何上述 |
[^aeiou] | 匹配元音以外的任何一個小寫字符 |
[^0-9] | 匹配數字以外的任何其他 |
\d | 匹配一個數字: [0-9] |
\D | 匹配一個非數字: [^0-9] |
\s | 匹配一個空白字符: [ f] |
\S | 匹配非空白: [^ f] |
\w | 匹配一個字符: [A-Za-z0-9_] |
\W | 匹配 一個非單詞字符: [^A-Za-z0-9_] |
ruby? | 匹配 "rub" or "ruby": the y is optional |
ruby* | 匹配 "rub" plus 0 or more ys |
ruby+ | 匹配 "rub" plus 1 or more ys |
\d{3} | 匹配隻有 3 個數字 |
\d{3,} | 匹配 3 個或多個數字 |
\d{3,5} | 匹配3, 4, 或5 個數字 |
\D\d+ | 不分組: + repeats \d |
(\D\d)+/ | 分組: + repeats \Dd 對 |
([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(",")) } }
當上述代碼被編譯和執行時,它產生了以下結果:
C:/>scalac Test.scala C:/>scala Test able1 C:/>