Scala編程基礎(chǔ)26:Scala正則表達(dá)式

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)義字符旷祸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讼昆,隨后出現(xiàn)的幾起案子肋僧,更是在濱河造成了極大的恐慌,老刑警劉巖控淡,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異止潘,居然都是意外死亡掺炭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門凭戴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涧狮,“玉大人,你說我怎么就攤上這事么夫≌咴” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵档痪,是天一觀的道長涉枫。 經(jīng)常有香客問我,道長腐螟,這世上最難降的妖魔是什么愿汰? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮乐纸,結(jié)果婚禮上衬廷,老公的妹妹穿的比我還像新娘。我一直安慰自己汽绢,他們只是感情好吗跋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宁昭,像睡著了一般跌宛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上久窟,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天秩冈,我揣著相機(jī)與錄音,去河邊找鬼斥扛。 笑死入问,一個(gè)胖子當(dāng)著我的面吹牛丹锹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芬失,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼楣黍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棱烂?” 一聲冷哼從身側(cè)響起租漂,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颊糜,沒想到半個(gè)月后哩治,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衬鱼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年业筏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟赫。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒜胖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抛蚤,到底是詐尸還是另有隱情台谢,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布岁经,位于F島的核電站朋沮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒿偎。R本人自食惡果不足惜朽们,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诉位。 院中可真熱鬧骑脱,春花似錦、人聲如沸苍糠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岳瞭。三九已至拥娄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞳筏,已是汗流浹背稚瘾。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姚炕,地道東北人摊欠。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓丢烘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親些椒。 傳聞我的和親對象是個(gè)殘疾皇子播瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 搞懂Python 正則表達(dá)式用法 Python 正則表達(dá)式 正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,568評論 0 2
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能免糕,不關(guān)是正則表達(dá)式本身還是被搜索的字符串赢乓,都可以...
    喜歡吃栗子閱讀 3,981評論 0 13
  • 一、正則表達(dá)式語法 正則表達(dá)式是用匹配或者描述字符串的工具石窑。 用處:a.判斷字符串是否滿足某個(gè)條件---判斷輸入的...
    大漠判官1閱讀 348評論 0 1
  • python:正則表達(dá)式 什么是正則表達(dá)式 正則表達(dá)式也叫做匹配模式(Pattern)牌芋,它由一組具有特定含義的字符...
    清清子衿木子水心閱讀 466評論 0 2
  • (二) 晶姑娘回到宿舍,手心的余溫還未褪去松逊。她想給遠(yuǎn)方的閨蜜打個(gè)電話商量對策姜贡,卻怎么也拿不出卡在口袋里的手機(jī)。 舍...
    毛毛錦閱讀 195評論 0 0