本文目標
30分鐘內讓你明白Regex是什麼,並對它有一些基本的瞭解,讓你可以在自己的程式或網頁裡使用它。
如何使用本教程
別被下面那些複雜的運算式嚇倒,只要跟著我一步一步來,你會發現Regex其實並沒有你想像中的那麼困難。當然,如果你看完了這篇教程之後,發現自己明白了很多,卻又幾乎什麼都記不得,那也是很正常的——我認為,沒接觸過Regex的人在看完這篇教程後,能把提到過的文法記住80%以上的可能性為零。這裡只是讓你明白基本的原理,以後你還需要多練習,多使用,才能熟練掌握Regex。
除了作為入門教程之外,本文還試圖成為可以在日常工作中使用的Regex文法參考手冊。就作者本人的經曆來說,這個目標還是完成得不錯的——你看,我自己也沒能把所有的東西記下來,不是嗎?
Regex到底是什麼東西?
在編寫處理字串的程式或網頁時,經常會有尋找符合某些複雜規則的字串的需要。Regex就是用於描述這些規則的工具。換句話說,Regex就是記錄文本規則的代碼。
很可能你使用過Windows/Dos下用於檔案尋找的萬用字元(wildcard),也就是*和?。如果你想尋找某個目錄下的所有的Word文檔的話,你會搜尋*.doc。在這裡,*會被解釋成任意的字串。和萬用字元類似,Regex也是用來進行文本匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求——當然,代價就是更複雜——比如你可以編寫一個Regex,用來尋找所有以0開頭,後面跟著2-3個數字,然後是一個連字號“-”,最後是7或8位元字的字串(像010-12345678或0376-7654321)。
入門
學習Regex的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。
假設你在一篇英文小說裡尋找hi,你可以使用Regexhi。
這幾乎是最簡單的Regex了,它可以精確匹配這樣的字串:由兩個字元組成,前一個字元是h,後一個是i。通常,處理Regex的工具會提供一個忽略大小寫選項,如果選中了這個選項,它可以匹配hi,HI,Hi,hI這四種情況中的任意一種。
不幸的是,很多單詞裡包含hi這兩個連續的字元,比如him,history,high等等。用hi來尋找的話,這裡邊的hi也會被找出來。如果要精確地尋找hi這個單詞的話,我們應該使用\bhi\b。
\b是Regex規定的一個特殊代碼(好吧,某些人叫它元字元,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b並不匹配這些單詞分隔字元中的任何一個,它只匹配一個位置。
假如你要找的是hi後面不遠處跟著一個Lucy,你應該用\bhi\b.*\bLucy\b。
這裡,.是另一個元字元,匹配除了分行符號以外的任一字元。*同樣是元字元,不過它代表的不是字元,也不是位置,而是數量——它指定*前邊的內容可以連續重複使用任意次以使整個運算式得到匹配。因此,.*連在一起就意味著任意數量的不包含換行的字元。現在\bhi\b.*\bLucy\b的意思就很明顯了:先是一個單詞hi,然後是任意個任一字元(但不能是換行),最後是Lucy這個單詞。
如果同時使用其它元字元,我們就能構造出功能更強大的Regex。比如下面這個例子:
0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字串:以0開頭,然後是兩個數字,然後是一個連字號“-”,最後是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。
這裡的\d是個新的元字元,匹配一位元字(0,或1,或2,或……)。-不是元字元,只匹配它本身——連字號(或者減號,或者中橫線,或者隨你怎麼稱呼它)。
為了避免那麼多煩人的重複,我們也可以這樣寫這個運算式:0\d{2}-\d{8}。 這裡\d後面的{2}({8})的意思是前面\d必須連續重複匹配2次(8次)。
測試Regex
如果你不覺得Regex很難讀寫的話,要麼你是一個天才,要麼,你不是地球人。Regex的文法很令人頭疼,即使對經常使用它的人來說也是如此。由於難於讀寫,容易出錯,所以找一種工具對Regex進行測試是很有必要的。
不同的環境下Regex的一些細節是不相同的,本教程介紹的是微軟 .Net Framework 4.0 下Regex的行為,所以,我向你推薦我編寫的.Net下的工具 Regex測試器。請參考該頁面的說明來安裝和運行該軟體。
下面是Regex Tester運行時的截圖:
現在你已經知道幾個很有用的元字元了,如\b,.,*,還有\d.Regex裡還有更多的元字元,比如\s匹配任意的空白符,包括空格,定位字元(Tab),分行符號,中文全形空格等。\w匹配字母或數字或底線或漢字等。
下面來看看更多的例子:
\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。
\d+匹配1個或更多連續的數字。這裡的+是和*類似的元字元,不同的是*匹配重複任意次(可能是0次),而+則匹配重複1次或更多次。
\b\w{6}\b 匹配剛好6個字元的單詞。
表1.常用的元字元
| 代碼 |
說明 |
| . |
匹配除分行符號以外的任一字元 |
| \w |
匹配字母或數字或底線或漢字 |
| \s |
匹配任意的空白符 |
| \d |
匹配數字 |
| \b |
匹配單詞的開始或結束 |
| ^ |
匹配字串的開始 |
| $ |
匹配字串的結束 |
元字元^(和數字6在同一個鍵位上的符號)和$都匹配一個位置,這和\b有點類似。^匹配你要用來尋找的字串的開頭,$匹配結尾。這兩個代碼在驗證輸入的內容時非常有用,比如一個網站如果要求你填寫的QQ號必須為5位到12位元字時,可以使用:^\d{5,12}$。
這裡的{5,12}和前面介紹過的{2}是類似的,只不過{2}匹配只能不多不少重複2次,{5,12}則是重複的次數不能少於5次,不能多於12次,否則都不匹配。
因為使用了^和$,所以輸入的整個字串都要用來和\d{5,12}來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的QQ號能匹配這個Regex的話,那就符合要求了。
和忽略大小寫選項類似,有些Regex處理工具還有一個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。
[1] [2] [3] [4] 下一頁