正則表達(dá)式

正則表達(dá)式是一種查找以及字符串替換操作谐宙。正則表達(dá)式在文本編輯器中廣泛使用坞笙,比如正則表達(dá)式被用于:

檢查文本中是否含有指定的特征詞

找出文中匹配特征詞的位置

從文本中提取信息铲敛,比如:字符串的子串

修改文本

與文本編輯器相似嘶卧,幾乎所有的高級(jí)編程語言都支持正則表達(dá)式。在這樣的語境下环戈,“文本”也就是一個(gè)字符串闷板,可以執(zhí)行的操作都是類似的。一些編程語言(比如Perl院塞,JavaScript)會(huì)檢查正則表達(dá)式的語法遮晚。

正則表達(dá)式是什么?

正則表達(dá)式只是一個(gè)字符串拦止。沒有長(zhǎng)度限制县遣,但是,這樣的正則表達(dá)式長(zhǎng)度往往較短汹族。如下所示是一些正則表達(dá)式的例子:

I had a \S+ day today

[A-Za-z0-9-_]{3,16}

\d\d\d\d-\d\d-\d\d

v(\d+)(.\d+)*

TotalMessages="(.*?)"

<[^<>]>

這些字符串實(shí)際上都是微型計(jì)算機(jī)程序萧求。正則表達(dá)式的語法,實(shí)際上是一種輕量級(jí)顶瞒、簡(jiǎn)潔夸政、適用于特定領(lǐng)域的編程語言。記住這一點(diǎn)榴徐,那么你就很容易理解下面的事情:

每一個(gè)正則表達(dá)式守问,都可以分解為一個(gè)指令序列,比如“先找到這樣的字符坑资,再找到那樣的字符耗帕,再?gòu)闹姓业揭粋€(gè)字符。盐茎。兴垦。”

每一個(gè)正則表達(dá)式都有輸入(文本)和輸出(匹配規(guī)則的輸出字柠,有時(shí)是修改后的文本)

正則表達(dá)式有可能出現(xiàn)語法錯(cuò)誤——不是所有的字符串都是正則表達(dá)式

正則表達(dá)式語法很有個(gè)性探越,也可以說很恐怖

有時(shí)可以通過編譯,使得正則表達(dá)式執(zhí)行更快

在實(shí)現(xiàn)中窑业,正則表達(dá)式還有其他的特點(diǎn)钦幔。本文將重點(diǎn)討論正則表達(dá)式的核心語法,在幾乎所有的正則表達(dá)式中都可以見到這些規(guī)則常柄。

特別提示:正則表達(dá)式與文件通配語法無關(guān)鲤氢,比如 *.xml

正則表達(dá)式的基礎(chǔ)語法

字符

正則表達(dá)式中包含了一系列的字符,這些字符只能匹配它們本身西潘。有一些被稱為“元字符”的特殊字符卷玉,可以匹配一些特殊規(guī)則。

如下所示的例子中喷市,我用紅色標(biāo)出了元字符相种。

I had a \S+ day today

[A-Za-z0-9-_]{3,16}

\d\d\d\d-\d\d-\d\d

v(\d+)(.\d+)*

TotalMessages="(.*?)"

<[^<>]*>

大部分的字符,包括所有的字母和數(shù)字字符品姓,是普通字符寝并。也就意味著箫措,它們只能匹配它們自己,如下所示的正則表達(dá)式:

cat

意味著衬潦,只能匹配一個(gè)字符串斤蔓,以“c”開頭,然后是字符“a”镀岛,緊跟著是字符“t”的字符串弦牡。

到目前為止,正則表達(dá)式的功能類似于

常規(guī)的Find功能

Java中的String.indexOf()函數(shù)

PHP中的strpos()函數(shù)

等等

注意:不做特殊說明哎媚,正則表達(dá)式中是區(qū)分大小寫的喇伯。但是,幾乎所有正則表達(dá)式的實(shí)現(xiàn)拨与,都會(huì)提供一個(gè)Flag用來控制是否區(qū)分大小寫稻据。

點(diǎn)“.”

我們第一個(gè)要講解的元字符是“.”。這個(gè)符號(hào)意味著可以匹配任意一個(gè)字符买喧。如下所示的正則表達(dá)式:

c.t

意味著匹配“以c開頭,之后是任意一個(gè)字符捻悯,緊跟著是字母t”的字符串。

在一段文本中淤毛,這樣的正則表達(dá)式可以用來找出cat,cot,czt這樣的字符串今缚,甚至可以找出c.t這樣的組合,但是不能找到ct或者是coot這樣的字符串低淡。

使用反斜杠“\”可以忽略元字符姓言,使得元字符的功能與普通字符一樣。所以蔗蹋,正則表達(dá)式

c.t

表示“找到字母c,然后是一個(gè)句號(hào)(“.”)何荚,緊跟著字母t”

反斜杠本身也是一個(gè)元字符,這意味著反斜杠本身也可以通過相似的方法變回到普通字符的用途猪杭。因此餐塘,正則表達(dá)式

c\t

表示匹配“以字符c開頭,然后是一個(gè)反斜杠,緊跟著是字母t”的字符串皂吮。

注意戒傻!在正則表達(dá)式的實(shí)現(xiàn)中,.是不能用于匹配換行符的蜂筹⌒枘桑”換行符“的表示方法在不同實(shí)現(xiàn)中也不同。實(shí)際編程時(shí)艺挪,請(qǐng)參考相關(guān)文檔不翩。在本文中,我認(rèn)為.是可以匹配任意字符的。實(shí)現(xiàn)環(huán)境通常會(huì)提供一個(gè)Flag標(biāo)志位慌盯,來控制這一點(diǎn)。

字符類

字符類是一組在方括號(hào)內(nèi)的字符掂器,表示可以匹配其中的任何一個(gè)字符亚皂。

正則表達(dá)式c[aeiou]t,表示可以匹配的字符串是”以c開頭国瓮,接著是aeiou中的任何一個(gè)字符灭必,最后以t結(jié)尾”。在文本的實(shí)際應(yīng)用中乃摹,這樣的正則表達(dá)式可以匹配:cat,cet,cit,cot,cut五種字符串禁漓。

正則表達(dá)式[0123456789]表示匹配任意一個(gè)整數(shù)。

正則表達(dá)式[a]表示匹配單字符a孵睬。

包含忽略字符的例子

a表示匹配字符串[a]

[[]\ab]表示匹配的字符為”[“或者”]”或者”a”,或者”b”

[\[]]表示匹配的字符為”\”或者 “[”或者”]”

在字符類中播歼,字符的重復(fù)和出現(xiàn)順序并不重要。[dabaaabcc]與[abc]是相同的

重要提示:字符類中和字符類外的規(guī)則有時(shí)不同掰读,一些字符在字符類中是元字符秘狞,在字符類外是普通字符。一些字符正好相反蹈集。還有一些字符在字符類中和字符類外都是元字符烁试,這要視情況而定!

比如拢肆,.表示匹配任意一個(gè)字符减响,而[.]表示匹配一個(gè)全角句號(hào)。這不是一回事郭怪!

字符類的范圍

在字符集中支示,你可以通過使用短橫線來表示匹配字母或數(shù)字的范圍。

[b-f]與[b,c,d,e,f]相同移盆,都是匹配一個(gè)字符”b”或”c”或”d”或”e”或”f”

[A-Z]與[ABCDEFGHIJKLMNOPQRSTUVWXYZ]相同悼院,都是匹配任意一個(gè)大寫字母。

[1-9]與[123456789]相同咒循,都是匹配任意一個(gè)非零數(shù)字据途。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叙甸,隨后出現(xiàn)的幾起案子颖医,更是在濱河造成了極大的恐慌,老刑警劉巖裆蒸,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔萧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)佛致,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門贮缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俺榆,你說我怎么就攤上這事感昼。” “怎么了罐脊?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵定嗓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我萍桌,道長(zhǎng)宵溅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任上炎,我火速辦了婚禮恃逻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藕施。我一直安慰自己辛块,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布铅碍。 她就那樣靜靜地躺著润绵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胞谈。 梳的紋絲不亂的頭發(fā)上尘盼,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音烦绳,去河邊找鬼卿捎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛径密,可吹牛的內(nèi)容都是我干的午阵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼享扔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼底桂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惧眠,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤籽懦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氛魁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暮顺,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厅篓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捶码。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽氮。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惫恼,靈堂內(nèi)的尸體忽然破棺而出乏苦,到底是詐尸還是另有隱情,我是刑警寧澤尤筐,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站洞就,受9級(jí)特大地震影響盆繁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旬蟋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一油昂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倾贰,春花似錦冕碟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至首尼,卻和暖如春挑庶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背软能。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工迎捺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人查排。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓凳枝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跋核。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岖瑰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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