正規表示式教學重複比對詳解
本文實例講述了正規表示式教程之重複匹配。分享給大家供大家參考,具體如下:
注:在所有例子中正則表達式匹配結果包含在源文本中的【和】之間,有的例子會使用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中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。
