首頁 > web前端 > js教程 > 正規的重複配對使用詳解

正規的重複配對使用詳解

php中世界最好的语言
發布: 2018-03-30 09:48:12
原創
1860 人瀏覽過

這次帶給大家正規的重複配對使用詳解,正規重複配對使用的注意事項有哪些,以下就是實戰案例,一起來看一下。

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

註:在所有例子中正規表示式匹配結果包含在源文本中的之間,有的例子會使用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, 【mhmyqn@qq.com】 or 【mhmyqn@126.com】 is my email.

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

2、符合零個或多個字元

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

3、符合零個或一個字元

符合零個或一個字元使用元字元?。像上一篇說到的符合一個空白行使用正規表示式\r\n\r\n,但在Unix和Linux中不需要\r,就可以使用元字元?,\r?\n\r? \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.0

##$2500.44

$44.30

正規表示式:

$\d{3,}\.\d{2}

#結果:

##$25.36

【$125.36】

【$205.0】

##【$2500.44】

#$44.30

+、*、?可以表示成重複次數:

+等價於{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 < B>mystery, but today is a gift

.

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

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

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

##*       *?

+       +?

#{n,}   {n,}?

所以上面的範例中,正規表示式只需改成<[Bb]>.*?即可,結果如下:

history

mystery

#gift

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

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

正規表示式教學的位置比對教學(附程式碼)


用php與js實現正規符合數字和字母組合的密碼

以上是正規的重複配對使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板