本文目標(biāo)
30分鐘內(nèi)讓你明白正則表達(dá)式是什么,并對(duì)它有一些基本的了解,讓你可以在自己的程序或網(wǎng)頁(yè)里使用它。
如何使用本教程
別被下面那些復(fù)雜的表達(dá)式嚇倒,只要跟著我一步一步來,你會(huì)發(fā)現(xiàn)正則表達(dá)式其實(shí)并沒有你想像中的那么困難。當(dāng)然,如果你看完了這篇教程之后,發(fā)現(xiàn)自己明白了很多,卻又幾乎什么都記不得,那也是很正常的——我認(rèn)為,沒接觸過正則表達(dá)式的人在看完這篇教程后,能把提到過的語(yǔ)法記住80%以上的可能性為零。這里只是讓你明白基本的原理,以后你還需要多練習(xí),多使用,才能熟練掌握正則表達(dá)式。
除了作為入門教程之外,本文還試圖成為可以在日常工作中使用的正則表達(dá)式語(yǔ)法參考手冊(cè)。就作者本人的經(jīng)歷來說,這個(gè)目標(biāo)還是完成得不錯(cuò)的——你看,我自己也沒能把所有的東西記下來,不是嗎?
正則表達(dá)式到底是什么東西?
在編寫處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話說,正則表達(dá)式就是記錄文本規(guī)則的代碼。
很可能你使用過Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某個(gè)目錄下的所有的Word文檔的話,你會(huì)搜索*.doc。在這里,*會(huì)被解釋成任意的字符串。和通配符類似,正則表達(dá)式也是用來進(jìn)行文本匹配的工具,只不過比起通配符,它能更精確地描述你的需求——當(dāng)然,代價(jià)就是更復(fù)雜——比如你可以編寫一個(gè)正則表達(dá)式,用來查找所有以0開頭,后面跟著2-3個(gè)數(shù)字,然后是一個(gè)連字號(hào)“-”,最后是7或8位數(shù)字的字符串(像010-12345678或0376-7654321)。
入門
學(xué)習(xí)正則表達(dá)式的最好方法是從例子開始,理解例子之后再自己對(duì)例子進(jìn)行修改,實(shí)驗(yàn)。下面給出了不少簡(jiǎn)單的例子,并對(duì)它們作了詳細(xì)的說明。
假設(shè)你在一篇英文小說里查找hi,你可以使用正則表達(dá)式hi。
這幾乎是最簡(jiǎn)單的正則表達(dá)式了,它可以精確匹配這樣的字符串:由兩個(gè)字符組成,前一個(gè)字符是h,后一個(gè)是i。通常,處理正則表達(dá)式的工具會(huì)提供一個(gè)忽略大小寫的選項(xiàng),如果選中了這個(gè)選項(xiàng),它可以匹配hi,HI,Hi,hI這四種情況中的任意一種。
不幸的是,很多單詞里包含hi這兩個(gè)連續(xù)的字符,比如him,history,high等等。用hi來查找的話,這里邊的hi也會(huì)被找出來。如果要精確地查找hi這個(gè)單詞的話,我們應(yīng)該使用\bhi\b。
\b是正則表達(dá)式規(guī)定的一個(gè)特殊代碼(好吧,某些人叫它元字符,metacharacter),代表著單詞的開頭或結(jié)尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標(biāo)點(diǎn)符號(hào)或者換行來分隔的,但是\b并不匹配這些單詞分隔字符中的任何一個(gè),它只匹配一個(gè)位置。
假如你要找的是hi后面不遠(yuǎn)處跟著一個(gè)Lucy,你應(yīng)該用\bhi\b.*\bLucy\b。
這里,.是另一個(gè)元字符,匹配除了換行符以外的任意字符。*同樣是元字符,不過它代表的不是字符,也不是位置,而是數(shù)量——它指定*前邊的內(nèi)容可以連續(xù)重復(fù)使用任意次以使整個(gè)表達(dá)式得到匹配。因此,.*連在一起就意味著任意數(shù)量的不包含換行的字符。現(xiàn)在\bhi\b.*\bLucy\b的意思就很明顯了:先是一個(gè)單詞hi,然后是任意個(gè)任意字符(但不能是換行),最后是Lucy這個(gè)單詞。
如果同時(shí)使用其它元字符,我們就能構(gòu)造出功能更強(qiáng)大的正則表達(dá)式。比如下面這個(gè)例子:
0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字符串:以0開頭,然后是兩個(gè)數(shù)字,然后是一個(gè)連字號(hào)“-”,最后是8個(gè)數(shù)字(也就是中國(guó)的電話號(hào)碼。當(dāng)然,這個(gè)例子只能匹配區(qū)號(hào)為3位的情形)。
這里的\d是個(gè)新的元字符,匹配一位數(shù)字(0,或1,或2,或……)。-不是元字符,只匹配它本身——連字符(或者減號(hào),或者中橫線,或者隨你怎么稱呼它)。
為了避免那么多煩人的重復(fù),我們也可以這樣寫這個(gè)表達(dá)式:0\d{2}-\d{8}。 這里\d后面的{2}({8})的意思是前面\d必須連續(xù)重復(fù)匹配2次(8次)。