Scala通過scala.util.matching包中的Regex類來支持正則表達(dá)式隔披。
1.查找首個(gè)匹配項(xiàng)
以下實(shí)例演示了使用正則表達(dá)式查找單詞Scala:
import scala.util.matching.Regex
object Test1{
def main(args:Array[String]){
val pattern="Scala".r;
val str="Scala is Scalable and cool";
println(pattern findFirstIn str);
}
}
編譯并執(zhí)行以上代碼何吝,輸出結(jié)果如下:
E:\Test>scalac Test1.scala
E:\Test>scala Test1
Some(Scala)
實(shí)例中使用String類的r()方法夠早了一個(gè)Regex對象。然后使用findFirstIn方法找到第一個(gè)匹配項(xiàng)可婶。
2.查找所有匹配項(xiàng)
如果需要查找所有的匹配項(xiàng),可以使用findAllIn方法畅卓。你可以使用mkString()方法來連接正則表達(dá)式匹配結(jié)果的字符串尉咕,并可以使用管道符”|”(表示或)來設(shè)置不同的模式:
import scala.util.matching.Regex
object Test2{
def main(args:Array[String]){
val pattern = new Regex("(S|s)cala");
val str = "Scala is scalable and cool";
println((pattern findAllIn str).mkString(","));
}
}
編譯并執(zhí)行上述代碼,輸出結(jié)果如下:
E:\Test>scalac Test2.scala
E:\Test>scala Test2
Scala,scala
3.替換匹配項(xiàng)
如果需要將匹配到的文本替換為指定的關(guān)鍵詞毕匀,可以使用replaceFirstIn()來替換匹配到的第一個(gè)匹配項(xiàng)铸鹰,同理可以使用replaceAllIn()方法替換所有匹配項(xiàng):
import scala.util.matching.Regex
object Test3{
def main(args:Array[String]){
val pattern = "(S|s)cala".r;
val str = "Scala is scalable and cool";
println(pattern replaceFirstIn(str,"Java"));
println(pattern replaceAllIn(str,"Java"));
}
}
編譯并執(zhí)行以上代碼,輸出結(jié)果如下:
E:\Test>scalac Test3.scala
E:\Test>scala Test3
Java is scalable and cool
Java is Javable and cool
4.正則表達(dá)式規(guī)則
下面列出了常用的正則表達(dá)式規(guī)則:
表達(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,} | 至少重復(fù)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″涯穷。 |
5.正則表達(dá)式實(shí)例
下面列出了一些常用的正則表達(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”,等等 |
注意:上述正則表達(dá)式中的”\\”表示一個(gè)反斜線”\”字符屠尊,這是因?yàn)镾cala中一個(gè)反斜線表示轉(zhuǎn)義字符旷祸。