這次帶給大家正規的重複配對使用詳解,正規重複配對使用的注意事項有哪些,以下就是實戰案例,一起來看一下。
本文實例講述了正規表示式教程之重複匹配。分享給大家供大家參考,具體如下:
註:在所有例子中正規表示式匹配結果包含在源文本中的【和】之間,有的例子會使用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]>. *[Bb]>
結果:
Yesterday is【history,tomorrow is a < B>mystery, but today is a gift】
.##分析:<[Bb]>符合標籤標籤(不區分大小寫),[Bb]>匹配標籤(不區分大小寫)。但結果卻不是預期的那樣有三個,第一個標籤之後,一直到最後一個之間的東西全部匹配出來了。 為什麼會這樣呢?因為*和+都是貪婪型的元字符,它們在匹配時的行為模式是多多益善,它們會盡可能從一段文本的開頭一直匹配到這段文本的末尾,而不是從這段文本的開頭匹配到碰到第一個匹配時為止。 當不需要這種貪婪行為時,可以使用這些元字元的懶惰型版本。懶惰意思是匹配盡可能少的字符,與貪婪型相反。懶惰型元字元只需在貪婪型元字元加上一個?後綴即可。以下是貪婪型元字元對應的懶惰型版本: ##* *? + +? #{n,} {n,}? history mystery #gift #四、總結##正規表示式的真下威力體現在重複次數匹配方面。這裡介紹了+、*、?幾種元字元的用法,如果要精確的確定符合次數,使用{}。元字符分貪婪型和懶惰型兩種,在需要防止過度匹配的場合下,請使用懶惰型元字符來構造正規表示式。在下一篇將會介紹位置匹配。 相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章! 推薦閱讀:
以上是正規的重複配對使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!