国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Scala Tutorial / Scala 正則表達(dá)式

Scala 正則表達(dá)式

Scala 通過 scala.util.matching 包種的 Regex 類來支持正則表達(dá)式。以下實(shí)例演示了使用正則表達(dá)式查找單詞 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)
   }
}

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Test.scala 
$ scala Test
Some(Scala)

實(shí)例中使用 String 類的 r() 方法構(gòu)造了一個(gè)Regex對象。

然后使用 findFirstIn 方法找到首個(gè)匹配項(xiàng)。

如果需要查看所有的匹配項(xiàng)可以使用 findAllIn 方法。

你可以使用 mkString( ) 方法來連接正則表達(dá)式匹配結(jié)果的字符串,并可以使用管道(|)來設(shè)置不同的模式:

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(","))   // 使用逗號 , 連接返回結(jié)果
   }
}

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Test.scala 
$ scala Test
Scala,scala

如果你需要將匹配的文本替換為指定的關(guān)鍵詞,可以使用 replaceFirstIn( ) 方法來替換第一個(gè)匹配項(xiàng),使用 replaceAllIn( ) 方法替換所有匹配項(xiàng),實(shí)例如下:

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"))
   }
}

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

正則表達(dá)式

Scala 的正則表達(dá)式繼承了 Java 的語法規(guī)則,Java 則大部分使用了 Perl 語言的規(guī)則。

下表我們給出了常用的一些正則表達(dá)式規(guī)則:

<td重復(fù)n次或更多次< td="">
表達(dá)式匹配規(guī)則
^ 匹配輸入字符串開始的位置。
$匹配輸入字符串結(jié)尾的位置。
.匹配除"\r\n"之外的任何單個(gè)字符。
[...]字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
[^...]反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。
\\A匹配輸入字符串開始的位置(無多行支持)
\\z字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)
\\Z字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)
re*重復(fù)零次或更多次
re+重復(fù)一次或更多次
re?重復(fù)零次或一次
re{ n}重復(fù)n次
re{ n,}
re{ n, m}重復(fù)n到m次
a|b匹配 a 或者 b
(re)匹配 re,并捕獲文本到自動(dòng)命名的組里
(?: re)匹配 re,不捕獲匹配的文本,也不給此分組分配組號
(?> re)貪婪子表達(dá)式
\\w匹配字母或數(shù)字或下劃線或漢字
\\W匹配任意不是字母,數(shù)字,下劃線,漢字的字符
\\s匹配任意的空白符,相等于 [\t\n\r\f]
\\S匹配任意不是空白符的字符
\\d匹配數(shù)字,類似 [0-9]
\\D匹配任意非數(shù)字的字符
\\G當(dāng)前搜索的開頭
\\n換行符
\\b通常是單詞分界位置,但如果在字符類里使用代表退格
\\B匹配不是單詞開頭或結(jié)束的位置
\\t制表符
\\Q開始引號:\Q(a+b)*3\E 可匹配文本 "(a+b)*3"。
\\E結(jié)束引號:\Q(a+b)*3\E 可匹配文本 "(a+b)*3"。

正則表達(dá)式實(shí)例

實(shí)例描述
.匹配除"\r\n"之外的任何單個(gè)字符。
[Rr]uby匹配 "Ruby" 或 "ruby"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配小寫字母 :aeiou
[0-9]匹配任何數(shù)字,類似 [0123456789]
[a-z]匹配任何 ASCII 小寫字母
[A-Z]匹配任何 ASCII 大寫字母
[a-zA-Z0-9]匹配數(shù)字,大小寫字母
[^aeiou]匹配除了 aeiou 其他字符
[^0-9]匹配除了數(shù)字的其他字符
\\d匹配數(shù)字,類似: [0-9]
\\D匹配非數(shù)字,類似: [^0-9]
\\s匹配空格,類似: [ \t\r\n\f]
\\S匹配非空格,類似: [^ \t\r\n\f]
\\w匹配字母,數(shù)字,下劃線,類似: [A-Za-z0-9_]
\\W匹配非字母,數(shù)字,下劃線,類似: [^A-Za-z0-9_]
ruby?匹配 "rub" 或 "ruby":  y 是可選的
ruby*匹配 "rub" 加上 0 個(gè)或多個(gè)的 y。
ruby+匹配 "rub" 加上 1 個(gè)或多個(gè)的 y。
\\d{3}剛好匹配 3 個(gè)數(shù)字。
\\d{3,}匹配 3 個(gè)或多個(gè)數(shù)字。
\\d{3,5}匹配 3 個(gè)、4 個(gè)或 5 個(gè)數(shù)字。
\\D\\d+無分組: + 重復(fù) \d
(\\D\\d)+/分組: + 重復(fù) \D\d 對
([Rr]uby(, )?)+匹配 "Ruby"、"Ruby, ruby, ruby",等等

注意上表中的每個(gè)字符使用了兩個(gè)反斜線。這是因?yàn)樵?Java 和 Scala 中字符串中的反斜線是轉(zhuǎn)義字符。所以如果你要輸出 .\.,你需要在字符串中寫成 .\\. 來獲取一個(gè)反斜線。查看以下實(shí)例:

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(","))
   }
}

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Test.scala 
$ scala Test
able1