當前位置:
首頁 > 知識 > Scala 正則表達式

Scala 正則表達式

Scala 通過 scala.util.matching 包中的 Regex 類來支持正則表達式。以下實例演示了使用正則表達式查找單詞 Scala :

import scala.util.matching.Regexobject 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 TestSome(Scala)

實例中使用 String 類的 r() 方法構造了一個Regex對象。

然後使用 findFirstIn 方法找到首個匹配項。

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

你可以使用 mkString( ) 方法來連接正則表達式匹配結果的字元串,並可以使用管道(|)來設置不同的模式:

import scala.util.matching.Regexobject 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 TestScala,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 TestJava is scalable and cool


Scala 正則表達式

正則表達式

Scala 的正則表達式繼承了 Java 的語法規則,Java 則大部分使用了 Perl 語言的規則。

下表我們給出了常用的一些正則表達式規則:

<td重複n次或更多次< td="" data-filtered="filtered" stylex="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", "WenQuanYi Micro Hei", Arial, sans-serif; font-size: 12px; white-space: normal;">


表達式 匹配規則
^ 匹配輸入字元串開始的位置。
$ 匹配輸入字元串結尾的位置。
. 匹配除"
"之外的任何單個字元。
[...] 字符集。匹配包含的任一字元。例如,"[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 匹配任意的空白符,相等於 [

f]

\S 匹配任意不是空白符的字元
\d 匹配數字,類似 [0-9]
\D 匹配任意非數字的字元
\G 當前搜索的開頭
\n 換行符
\b 通常是單詞分界位置,但如果在字元類里使用代表退格
\B 匹配不是單詞開頭或結束的位置
\t 製表符
\Q 開始引號:Q(a+b)*3E 可匹配文本 "(a+b)*3"。
\E 結束引號:Q(a+b)*3E 可匹配文本 "(a+b)*3"。



正則表達式實例


實例 描述
. 匹配除"
"之外的任何單個字元。
[Rr]uby 匹配 "Ruby" 或 "ruby"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配小寫字母 :aeiou
[0-9] 匹配任何數字,類似 [0123456789]
[a-z] 匹配任何 ASCII 小寫字母
[A-Z] 匹配任何 ASCII 大寫字母
[a-zA-Z0-9] 匹配數字,大小寫字母
[^aeiou] 匹配除了 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" 或 "ruby": y 是可選的
ruby* 匹配 "rub" 加上 0 個或多個的 y。
ruby+ 匹配 "rub" 加上 1 個或多個的 y。
\d{3} 剛好匹配 3 個數字。
\d{3,} 匹配 3 個或多個數字。
\d{3,5} 匹配 3 個、4 個或 5 個數字。
\D\d+ 無分組: + 重複 d
(\D\d)+/ 分組: + 重複 Dd 對
([Rr]uby(, )?)+ 匹配 "Ruby"、"Ruby, ruby, ruby",等等

注意上表中的每個字元使用了兩個反斜線。這是因為在 Java 和 Scala 中字元串中的反斜線是轉義字元。所以如果你要輸出 ..,你需要在字元串中寫成 .\. 來獲取一個反斜線。查看以下實例:

import scala.util.matching.Regexobject 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 Testable1

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Perl 循環
Docker 架構

TAG:程序員小新人學習 |