正規表示式30分鐘入門教程

2023-01-05 07:00:04 字數 4573 閱讀 8662

目錄跳過目錄

1. 本文目標

2. 如何使用本教程

3. 正規表示式到底是什麼東西?

4. 入門

5. 測試正規表示式

6. 元字元

7. 字元轉義

8. 重複

9. 字元類

10. 分枝條件

11. 反義

12. 分組

13. 後向引用

14. 零寬斷言

15. 負向零寬斷言

16. 注釋

17. 貪婪與懶惰

18. 處理選項

19. 平衡組/遞迴匹配

20. 還有些什麼東西沒提到

21. 聯絡作者

22. 網上的資源及本文參考文獻

23. 更新紀錄

本文目標

30分鐘內讓你明白正規表示式是什麼,並對它有一些基本的了解,讓你可以在自己的程式或網頁裡使用它。

如何使用本教程

最重要的是——請給我30分鐘,如果你沒有使用正規表示式的經驗,請不要試圖在30秒內入門——除非你是超人 :)

別被下面那些複雜的表示式嚇倒,只要跟著我一步一步來,你會發現正規表示式其實並沒有想像中的那麼困難。當然,如果你看完了這篇教程之後, 發現自己明白了很多,卻又幾乎什麼都記不得,那也是很正常的——我認為,沒接觸過正規表示式的人在看完這篇教程後,能把提到過的語法記住80%以上的可能性為零。這裡只是讓你明白基本的原理,以後你還需要多練習,多使用,才能熟練掌握正規表示式。

除了作為入門教程之外,本文還試圖成為可以在日常工作中使用的正規表示式語法參考手冊。就作者本人的經歷來說,這個目標還是完成得不錯的——你看,我自己也沒能把所有的東西記下來,不是嗎?

清除格式文字格式約定:專業術語元字元/語法格式正規表示式正規表示式中的一部分(用於分析)對其進行匹配的源字串對正規表示式或其中一部分的說明

隱藏邊注本文右邊有一些注釋,主要是用來提供一些相關資訊,或者給沒有程式設計師背景的讀者解釋一些基本概念,通常可以忽略。

正規表示式到底是什麼東西?

字元是計算機軟體處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等等。字串是0個或更多個字元的序列。文字也就是文字,字串。

說某個字串匹配某個正規表示式,通常是指這個字串裡有一部分(或幾部分分別)能滿足表示式給出的條件。

在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要。正規表示式就是用於描述這些規則的工具。換句話說,正規表示式就是記錄文字規則的**。

很可能你使用過windows/dos下用於檔案查詢的萬用字元(wildcard),也就是*和?。如果你想查詢某個目錄下的所有的word文件的話,你會搜尋*.doc。

在這裡,*會被解釋成任意的字串。和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求——當然,代價就是更複雜——比如你可以編寫乙個正規表示式,用來查詢所有以0開頭,後面跟著2-3個數字,然後是乙個連字型大小「-」,最後是7或8位數字的字串(像010-********或0376

入門學習正規表示式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。

假設你在一篇英文**裡查詢hi,你可以使用正規表示式hi。

這幾乎是最簡單的正規表示式了,它可以精確匹配這樣的字串:由兩個字元組成,前乙個字元是h,後乙個是i。通常,處理正規表示式的工具會提供乙個忽略大小寫的選項,如果選中了這個選項,它可以匹配hi,hi,hi,hi這四種情況中的任意一種。

不幸的是,很多單詞裡包含hi這兩個連續的字元,比如him,history,high等等。用hi來查詢的話,這裡邊的hi也會被找出來。如果要精確地查詢hi這個單詞的話,我們應該使用\bhi\b。

\b是正規表示式規定的乙個特殊**(好吧,某些人叫它元字元,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b並不匹配這些單詞分隔字元中的任何乙個,它只匹配乙個位置。

如果需要更精確的說法,\b匹配這樣的位置:它的前乙個字元和後乙個字元不全是(乙個是,乙個不是或不存在)\w。

假如你要找的是hi後面不遠處跟著乙個lucy,你應該用\bhi\b.*\blucy\b。

這裡,.是另乙個元字元,匹配除了換行符以外的任意字元。*同樣是元字元,不過它代表的不是字元,也不是位置,而是數量——它指定*前邊的內容可以連續重複使用任意次以使整個表示式得到匹配。

因此,.*連在一起就意味著任意數量的不包含換行的字元。現在\bhi\b.

*\blucy\b的意思就很明顯了:先是乙個單詞hi,然後是任意個任意字元(但不能是換行),最後是lucy這個單詞。

換行符就是'\n',ascii編碼為10(十六進製制0x0a)的字元。

如果同時使用其它元字元,我們就能構造出功能更強大的正規表示式。比如下面這個例子:

0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字串:以0開頭,然後是兩個數字,然後是乙個連字型大小「-」,最後是8個數字(也就是中國的**號碼。當然,這個例子只能匹配區號為3位的情形)。

這裡的\d是個新的元字元,匹配一位數字(0,或1,或2,或……)。-不是元字元,只匹配它本身——連字元(或者減號,或者中橫線,或者隨你怎麼稱呼它)。

為了避免那麼多煩人的重複,我們也可以這樣寫這個表示式:0\d-\d。這裡\d後面的()的意思是前面\d必須連續重複匹配2次(8次)。

測試正規表示式

其它可用的測試工具:

regexbuddy

j**ascript正規表示式**測試工具

如果你不覺得正規表示式很難讀寫的話,要麼你是乙個天才,要麼,你不是地球人。正規表示式的語法很令人頭疼,即使對經常使用它的人來說也是如此。由於難於讀寫,容易出錯,所以找一種工具對正規表示式進行測試是很有必要的。

不同的環境下正規表示式的一些細節是不相同的,本教程介紹的是微軟 .net framework 4.0 下正規表示式的行為,所以,我向你推薦我編寫的.

net下的工具正規表示式測試器。請參考該頁面的說明來安裝和執行該軟體。

下面是regex tester執行時的截圖:

元字元現在你已經知道幾個很有用的元字元了,如\b,.,*,還有\d.正規表示式裡還有更多的元字元,比如\s匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等。

\w匹配字母或數字或下劃線或漢字等。

對中文/漢字的特殊處理是由.net提供的正規表示式引擎支援的,其它環境下的具體情況請檢視相關文件。

下面來看看更多的例子:

\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。

好吧,現在我們說說正規表示式裡的單詞是什麼意思吧:就是不少於乙個的連續的\w。不錯,這與學習英文時要背的成千上萬個同名的東西的確關係不大 :)

\d+匹配1個或更多連續的數字。這裡的+是和*類似的元字元,不同的是*匹配重複任意次(可能是0次),而+則匹配重複1次或更多次。

\b\w\b 匹配剛好6個字元的單詞。

正規表示式引擎通常會提供乙個「測試指定的字串是否匹配乙個正規表示式」的方法,如j**ascript裡的方法或.net裡的方法。這裡的匹配是指是字串裡有沒有符合表示式規則的部分。

如果不使用^和$的話,對於\d而言,使用這樣的方法就只能保證字串裡包含5到12連續位數字,而不是整個字串就是5到12位數字。

元字元^(和數字6在同乙個鍵位上的符號)和$都匹配乙個位置,這和\b有點類似。^匹配你要用來查詢的字串的開頭,$匹配結尾。這兩個**在驗證輸入的內容時非常有用,比如乙個**如果要求你填寫的qq號必須為5位到12位數字時,可以使用:

^\d$。

這裡的和前面介紹過的是類似的,只不過匹配只能不多不少重複2次,則是重複的次數不能少於5次,不能多於12次,否則都不匹配。

因為使用了^和$,所以輸入的整個字串都要用來和\d來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的qq號能匹配這個正規表示式的話,那就符合要求了。

和忽略大小寫的選項類似,有些正規表示式處理工具還有乙個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。

字元轉義

如果你想查詢元字元本身的話,比如你查詢.,或者*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。

這時你就得使用\來取消這些字元的特殊意義。因此,你應該使用\.和\*。

當然,要查詢\本身,你也得用\\.

例如:deerchao\.net匹配匹配c:\windows。

重複你已經看過了前面的*,+,,這幾個匹配重複的方式了。下面是正規表示式中所有的限定符(指定數量的**,例如*,等):

下面是一些使用重複的例子:

windows\d+匹配windows後面跟1個或更多數字

^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)

字元類要想查詢數字,字母或數字,空白是很簡單的,因為已經有了對應這些字元集合的元字元,但是如果你想匹配沒有預定義元字元的字元集合(比如母音字母a,e,i,o,u),應該怎麼辦?

很簡單,你只需要在方括號裡列出它們就行了,像[aeiou]就匹配任何乙個英文母音字母,[.?!]匹配標點符號(.或?或!)。

我們也可以輕鬆地指定乙個字元範圍,像[0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)。

正規表示式

c 正規表示式經典分類整理集合手冊 作者 發布日期 2009 03 27 有一段時間,正規表示式學習很火熱很潮流,當時在csdn一天就能看到好幾個正規表示式的帖子,那段時間借助論壇以及wrox press出版的 c 字串和正規表示式參考手冊 學習了一些基礎的知識,同時也為我在csdn大概賺了1000...

常用正規表示式

漢字 u4e00 u9fff 考證數字 0 9 考證n位的數字 d 考證至多n位數字 d 考證m n位的數字 d 考證零和非零開頭的數字 0 1 9 0 9 考證有兩位小數的正實數 0 9 0 9 考證有1 3位小數的正實數 0 9 0 9 考證非零的正整數 1 9 0 9 考證非零的負整數 1 9...

正規表示式詳細

正規表示式是一種文字模式,包括普通字元 例如,a 到 z 之間的字母 和特殊字元 稱為 元字元 模式描述在搜尋文字時要匹配的乙個或多個字串。下面是正規表示式的一些示例 表示式匹配 s 匹配空行。d d 驗證由兩位數字 乙個連字元再加 5 位數字組成的 id 號。s s s s s s 1 s 匹配 ...