首頁 > web前端 > js教程 > 主體

正規表示式教學重複比對詳解

高洛峰
發布: 2017-01-09 16:01:55
原創
1577 人瀏覽過

本文實例講述了正規表示式教程之重複匹配。分享給大家供大家參考,具體如下:

注:在所有例子中正則表達式匹配結果包含在源文本中的【和】之間,有的例子會使用Java來實現,如果是java本身正則表達式的用法,會在對應的地方說明。所有java例子都在JDK1.6.0_13下測試通過。

一、有多少個匹配

前面幾篇講的都是匹配一個字符,但是一個字符或字符集合要匹配多次,應該怎麼做呢?例如要匹配一個電子郵件地址,用之前說到的方法,可能有人會寫出像w@w.w這樣的正規表示式,但這個只能匹配到像a@b.c這樣的地址,明顯是不正確的,接下來就來看看如何匹配電子郵件地址。

首先要知道電子郵件地址的組成:以字母數字或下劃線開頭的一組字符,後面跟@符號,再後面是域名,即用戶名@域名地址。不過這也跟具體的郵箱服務提供者有關,有的在用戶名中也允許.字符。

1、匹配一個或多個字符

要想匹配同一個字符(或字符集合)的多次重複,只要簡單地給這個字符(或字符集合)加上一個+字符作為後綴就可以了。 +符合一個或多個字元(至少一個)。如:a匹配a本身,a+將匹配一個或多個連續出現的a;[0-9]+匹配多個連續的數字。

注意:在給一個字符集合加上+後綴的時候,必須把+放在字符集合的外面,否則就不是重複匹配了。如[0-9+]這樣就表示數字或+號了,雖然語法上正確,但不是我們想要的了。

文字:Hello, mhmyqn@qq.com or mhmyqn@126.com is my email.

正規表示式:w+@(w+.)+w+

結果:Hello, 【w+@(w+.)+w+

結果:Hello, 【mhmyn, mhmyqn@126.com】 is my email.

分析:w+可以匹配一個或多個字符,而子表達式(w+.)+可匹配像xxxx.edu.這樣的字串,而最後不會是.字元結尾,所以後面還會有一個w+。像mhmyqn@xxxx.edu.cn這樣的郵件地址也會比對。

2、匹配零個或多個字符

匹配零個或多個字符使用元符*,它的用法和+完全一樣,只要把它放在一下字符或字符集合的後面,就可以匹配該字元(或字元集合)連續出現零次或多次。如正規表示式ab*c可以符合ac、abc、abbbbbc等。

3、匹配零個或一個字元

匹配零個或一個字元使用元字元?。像上一篇說到的符合一個空白行使用正規表示式rnrn,但在Unix和Linux中不需要r,就可以使用元字元?,r?nr?n這樣既可匹配windows中的空白行,也可符合Unix和Linux中的空白行。以下來看一個符合http或https協定的URL的範例:

文字:The URL is http://www.mikan.com, to connect securely use https://www.mikan.cominstead.

正規表示式:https?://(w+.)+w+

結果:The URL is 【http://www.mikan.com】, to connect securely use 【https://www.mikan.com】 instead.

分析:這個模式以https?開頭,表示?之前的一個字元可以有,也可以沒有,所以它能符合http或https,後面部分和前一個例子一樣。

二、匹配的重複次數

正則表達式裡的+、*和?解決了很多問題,但是:

1)+和*匹配的字符個數沒有上限。我們無法為它們將匹配的字元數設定一個最大值。

2)+、*和?至少符合一個或零個字元。我們無法為它們將匹配的字元數另行設定一個最小值。

3)如果只使用*和+,我們無法把它們將匹配的字元數設定為一個精確的數字。

正規表示式裡提供了一個用來設定重複次數的語法,重複次數要用{和}字元來給出,把數值寫在它們中間。

1、為重複配對次數設定一個精確值

如果想為重複配對次數設定一個精確的值,把那個數字寫在{和}之間即可。如{4}表示它前面的那個字元(或字元集合)必須在原始文字中連續重複出現4次才算是一個匹配,如果只出現了3次,也不算是一個匹配。

如前面幾篇中說到的匹配頁中顏色的例子,就可以用重複次數來匹配:#[[:xdigit:]]{6}或#[0-9a-fA-F]{6} ,POSIX字元在java中是#\p{XDigit}{6}。

2、為重複配對次數設定一個區間

{}語法還可以用來為重複配對次數設定一個區間,也就是為重複配對次數設定一個最小值和最大值。這種區間必須以{n, m}這樣的形式給出,其中n>=m>=0。如檢查日期格式是否正確(不檢查日期的有效性)的正規表示式(如日期2012-08-12或2012-8-12):d{4}-d{1,2}-d{1, 2}。

🎜3、配對至少重複幾次🎜

{}語法的最後一種用法是給出一個最小的重複次數(但不必給出最大重複次數),如{3,}表示至少重複3次。注意:{3,}中一定要有逗號,而且逗號後面不能有空格。否則會出錯。

來看一個例子,用正規表示式找出所有金額大於$100的金額:

文字:

$25.36

$125.36

$205.

$125.36

$205.正規表示式:$d{3 ,}.d{2}

結果:

$25.36

【$125.36】

【$205.0】

【$2500.444444448%

+等價於{1,}

*等價於{0,}

?等價於{0,1}

三、防止過度匹配

?只能匹配零個或一個字符,{n}和{ n,m}也有符合重複次數的上限,但像*、+、{n,}都沒有上限值,有時會導致過度配對的現象。

來看符合一個html標籤的範例

文字:

Yesterday is history,tomorrow is a mystery, but today is a gift.

正規表示式:.*[Bb]>

結果:

Yesterday is 【history,tomorrow is a mystery , but today is a gift】.

分析:符合標籤(不區分大小寫),[Bb]>符合標籤(不區分大小寫)。但結果卻不是預期的那樣有三個,第一個標籤之後,一直到最後一個之間的東西全部匹配出來了。

為什麼會這樣呢?因為*和+都是貪婪型的元字符,它們在匹配時的行為模式是多多益善,它們會盡可能從一段文本的開頭一直匹配到這段文本的末尾,而不是從這段文本的開頭匹配到碰到第一個符合時為止。

當不需要這種貪婪行為時,可以使用這些元字符的懶惰型版本。懶惰意思是匹配盡可能少的字符,與貪婪型相反。懶惰型元字元只需在貪婪型元字元加上一個?後綴即可。以下是貪婪型元字元對應的Bb]>.*?[Bb]>即可,結果如下:

history

mystery

gift

四、總結

正規表示式的真下威力體現在重複次數配對方面。這裡介紹了+、*、?幾種元字元的用法,如果要精確的確定符合次數,使用{}。元字符分貪婪型和懶惰型兩種,在需要防止過度匹配的場合下,請使用懶惰型元字符來構造正規表示式。在下一篇將會介紹位置匹配。

希望本文所述對大家正規表示式學習有所幫助。

更多正規表示式教學重複比對詳解相關文章請關注PHP中文網!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!