位置:首頁 > 高級語言 > Scala教學 > Scala正則表達式

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:/>