鑰匙要點
- 正則表達式(REGEX)是開發人員的寶貴工具,用於諸如日誌分析,形式提交驗證並查找和替換操作之類的任務。了解如何有效構建和使用正則表達式可以大大提高生產率和效率。
構建良好的正則是定義場景,制定計劃以及實施/測試/重構。重要的是要了解允許的字符類型,角色必須出現多少次以及要遵循的任何約束。
REGEX用法的實際示例- 包括匹配密碼,URL,特定的HTML標籤和重複的單詞。這些示例證明了字符範圍,斷言,條件,群體等的使用。
>
- > REGEX是一種強大的工具,但它也可能很複雜且難以管理。因此,有時使用幾個較小的正直而不是一個大的正則是更有效的。注意小組捕獲也可能使匹配對於進一步的處理更有用。
>
-
正則表達式通常用於執行搜索,替換子字符串和驗證字符串數據。本文提供了通過複雜的正則表達式進行的提示,技巧,資源和步驟。
如果您沒有基本技能,則可以通過我們的初學者指南學習正則表達式。作為正則表達式的奧術,您不會花很長時間學習這些概念。
有許多書籍,文章,網站來解釋正則表達式,因此,我不想寫另一個說明,而是要直接進行更實用的例子:
匹配密碼
- 匹配url
- 匹配特定的HTML標籤
- 匹配重複的單詞
-
您可以在此鏈接上找到有用的備忘單。除了大量有用的資源外,Lea Verou在這篇文章的底部還有一個會議視頻 - 它有點長,但在打破正則表達式方面非常出色。
如何構建良好的正則
正則表達式通常在開發人員的日常工作中使用 - 日誌分析,形式提交驗證,查找和替換等等。這就是為什麼每個好的開發人員都應該知道如何使用它們,但是建造好的正則是什麼最佳實踐是什麼?
1。定義方案
使用自然語言來定義問題,將使您更好地了解使用方法。這些單詞可以和必須在定義中使用,可用於描述強制性約束或斷言。
以下是一個示例:
字符串必須以“ H”開頭,並以“ O”結束(例如,Hello,Halo)。
對問題有很好的定義後,我們可以理解我們的正則表達中涉及的元素類型:
允許的字符類型(字,數字,新行,範圍,…)?
一個角色必須出現多少次(一個或多個,一次,…)?
在
3。實施/測試/重構
擁有實時測試環境以測試和改善正則表達非常重要。有Regex101.com,Regexr.com和Debuggex.com等網站提供一些最佳環境。
為了提高正則效率,您可以嘗試回答以下其他問題:
字符類是否正確定義了特定域?
>
我應該編寫更多測試字符串以涵蓋更多用例嗎? -
是否可以找到和隔離一些問題並分別測試它們?
- >我應該用子圖案,組,條件等重構表達式,以使其更小,更清晰,更靈活?
>
-
實例-
以下示例的目的不是寫一個只能解決問題的表達式,而是使用特定用例,使用字符範圍,斷言,條件,群體等的重要元素編寫最有效的表達式。
匹配密碼
設想:
長度
6至12個字符

必須至少有一個大寫字母
- >必須至少有一個下部案例字母
- 必須至少有一個數字
>
- 應包含其他字符
>
-
圖案:
^(?=。*[a-z])(?=。*[a-z])(?=。*d)。 {6,12} $
此表達式基於多個正lookahead(?=(REGEX))。 LookAhead匹配了一些聲明(Regex)的東西。條件的順序不會影響結果。當有幾種條件時,外觀表達式非常有用。
我們還可以使用負LookAhead(?!(REGEX))排除某些角色範圍。例如,我可以將%排除(?!。*#)。
讓我們解釋以上表達的每種模式:
- ^在字符串開始時斷言位置
(?=。*[a-z])正lookahead,斷言正則是。 *[a-z]可以匹配:
- 。 *匹配零和無限時間之間的任何字符(新線)
- [A-Z]匹配A和z之間的範圍內的一個字符
-
(?=。*[a-z])正lookahead,斷言正則是。 *[a-z]可以匹配:
-
。 *匹配零和無限時間之間的任何字符(新線)
[A-Z]匹配A和Z之間的單個字符(情況敏感)- >
-
(?=。 *d)積極的lookahead,斷言正則 *dcan是匹配的:
-
。 *匹配零和無限時間之間的任何字符(新線)
d匹配數字[0-9]-
之間的任何字符(Newline除外)
- $斷言字符串末尾的位置
匹配的URL

設想:
- 必須從http或https或ftp開始,然後是://
>
- 必須匹配有效的域名
- 可以包含端口規範(http://www.sitepoint.com:80)
- 可以包含數字,字母,點,連字符,前向斜線,多次
圖案:
^(http | https | ftp):[/] {2}([a-za-z0-9--。]。[a-za-z] {2,4})(:[0-9]) ? /? ([A-ZA-Z0-9 -._??,'/\&%$#=〜]*)*)
使用 ^(http | https | ftp):[/] {2}的第一種情況很容易解決。
要匹配域名,我們需要牢記,要有效,它只能包含字母,數字,連字符和點。在我的示例中,我將標點符號後的字符數量從2到4限制在2到4,但可以擴展到.Rocks或。編碼等新域。域名匹配([A-ZA-Z0-9-。]。[A-ZA-Z] {2,4})。
可選端口規範與簡單(:[0-9])?
一個URL可以包含多次重複多次的多個斜線和多個字符(請參閱RFC3986),通過在組中使用一系列字符可以匹配([a-za-Z0-9-._??,' /\&%$ #=〜]*)。
將每個重要元素與組捕獲()匹配非常有用,因為它將僅返回我們需要的匹配項。請記住,某些角色需要逃脫。
下面,每個副本都解釋了:
- ^在字符串開始時斷言位置
- 捕獲組(http | https | ftp),捕獲http或https或ftp
- :逃脫的角色,匹配角色:字面意思
- [ /] {2}恰好匹配逃脫的字符 /
的2倍
- 捕獲組([A-ZA-Z0-9-。]。[A-ZA-Z] {2,4}):
- [A-ZA-Z0-9-。 ]匹配A和z,a和z,z,0和9之間的一個和無限的時間字符,字面字符和字符。從字面上看
。匹配角色。從字面上看
- [a-za-z] {2,4}匹配A和Z或A和Z之間的2至4倍(CASE敏感)>
捕獲組(:[0-9])?
-
量詞?匹配零次或更多次之間的組
- :匹配字符:字面上
- [0-9]匹配0和9次或多次之間的單個字符
-
/?匹配字符 /字面零或一次
- >捕獲組([a-za-z0-9 -._??,'/\&%$#=〜]*)*):
- [a-za-z0-9 -._? ? ,'/\&%$#=〜]*匹配零和無限時間在a-z,a-z,a-z,0-9的單個字符之間: - ._? ,'/&%$#=〜。
匹配HTML TAG
設想:
開始標籤必須以

>結尾
結束標籤必須以一個或多個字符開始,然後以> - 結尾。
我們必須匹配標籤元素中的內容-
圖案:
(。*?)1>
匹配起始標籤和內部內容,它非常簡單地使用和(。*?),但是在上面的模式中,我添加了一個有用的內容:對捕獲組的引用。
每個由括號()定義的捕獲組都可以使用其位置號,(第一個)(第二)(第三),這將允許進一步操作。
以上表達可以解釋為:
-
以開始
捕獲標籤名稱
- 之後是一個或多個炭
>
- 捕獲標籤內的內容
- 名稱必須在>
之前捕獲名稱
-
表達式中只有兩個捕獲組,標籤名稱和內容將返回一個非常清晰的匹配,即帶有相關內容的標籤名稱列表。
讓我們更深入地解釋副本:
-
捕獲組([w])匹配任何單詞字符a-za-z0-9_一次或多次
- 。 *匹配零或更多次之間的任何字符(Newline除外)
- >匹配字符>字面上的
- 捕獲組(。
/匹配字符 /字面-
1匹配與第一個捕獲組相匹配的相同文本:([w])>
- >匹配字符>字面上
-
匹配重複的單詞-
設想:
-
單詞是空間分開的
我們必須匹配每個重複 - 非連續性
圖案:
b(w)b(?=。*1)
這種正則表達似乎具有挑戰性,但使用了先前顯示的一些概念。
該模式引入了單詞邊界的概念。
單詞邊界B主要檢查位置。當單詞字符(即abcde)之後是非單詞字符(即: - 〜,!)時,它與之匹配。
在下面,您可以找到單詞邊界的一些示例用途,以使其更清晰:
- 鑑於短語正則表達式很棒
- 模式的準匹配是
- 模式w {3} b可以與單詞的最後三個字母匹配:lar,ion,是,ome
以上表達可以解釋為:
- 匹配每個單詞字符,後跟一個非字角色(在我們的情況空間中)
檢查是否已經存在匹配的單詞-
在下面,您將找到每個子模式的解釋:
b字邊界-
捕獲組([w])匹配任何字字符a-za-z0-9_- >
b字邊界-
(?=。*1)正lookahead斷言以下內容可以匹配:
-
如果我們返回所有匹配,而不是僅返回第一個匹配項,則表達式將更有意義。有關更多信息,請參見php函數preg_match_all。
最終想法
正則表達式是雙刃劍。添加的複雜性越多,解決問題就越困難。這就是為什麼有時很難找到可以匹配所有情況的正則表達式的原因,最好使用幾個較小的正則表達式。
擁有一個良好的問題可能會非常有幫助,並且可以讓您開始思考角色範圍,約束,斷言,重複,可選值等。對組捕獲的更多關注將使匹配對進一步處理有用。隨意改善示例中的表情,讓我們知道您的工作方式!
有用的資源
在下面,您可以找到更多信息和資源,以幫助您的正則技能發展。
如果您發現未列出的有用的內容,請隨時在文章中添加評論。
lea verou - /reg(exp){2}LAIND/:神秘面紗的正則表達式
https://www.youtube.com/watch?v=eklues9rvak
> PHP庫
>名稱 |
描述 |
Regexpbuilder
使用人類可讀的方法創建正則
Noonoofluentregex
使用流利的設定器和以上類似的英語術語來構建正則表達式
Hoaregex
提供分析正則和生成字符串的工具
正則反向
給定正則表達式將生成一個字符串
>網站
url |
描述 |
Regex101.com
PCRE在線正則測試儀
regextester.com
PCRE在線正則測試儀
rexv.org
PCRE在線正則測試儀
debuggex.com
支持PCRE,並提供非常有用的視覺正則辯論式調試器
Regexper.com
JavaScript樣式的正則表達式,但可用於調試
phpliveregex.com
Preg功能的在線測試儀
regxlib.com
準備使用的正則表達式數據庫
常規表達
正則教程,書籍評論,示例
書籍
>標題 |
描述 |
作者 |
>編輯 |
掌握正則表達式
必須有正則書
杰弗裡·弗里德爾(Jeffrey Friedl)
O’Reilly
正則表達式袖珍參考
Perl,Ruby,Php,Python,C,Java和.net的正則表達式
托尼·喬布恩
O’Reilly
經常詢問的問題(常見問題解答)有關正則表達式(REGEX)
>正則表達式(REGEX)的哪些實際應用?它們通常在數據驗證中使用,以確保用戶輸入匹配特定格式,例如電子郵件地址或電話號碼。它們也可以用於網絡刮擦中,以從網頁中提取特定的信息。此外,REGEX可以用於文本處理中的任務,例如查找和替換特定的文本字符串,將字符串分配到一個子字符串中等等。 ?
創建複雜的正則表達式涉及理解和組合各種正則表達式組件。這些包括文字,角色類別,量詞和化角。通過以不同的方式組合這些組件,您可以創建符合各種圖案的正則表達式。例如,您可以創建一個與電子郵件地址,電話號碼或URL匹配的正則表達式。
>
使用正則表達式時,有什麼常見錯誤需要避免哪些錯誤? *),這可能導致意外的結果。另一個常見的錯誤是當要從字面上解釋特殊角色時,沒有正確地逃脫特殊字符。此外,重要的是要記住,默認情況下,正則表達式對大小寫敏感,因此,如果您想忽略案例,則需要使用適當的標誌。
>
>我如何測試我的正則表達式(REGEX)? >
>有幾種可用的在線工具可讓您測試正則表達式。這些工具通常允許您輸入正則表達式和測試字符串,然後突出顯示與正則表達式匹配的測試字符串的各個部分。這可能是調試正則表達式並確保它們按預期工作的好方法。
可以在所有編程語言中使用正則表達式(REGEX)嗎?表達某種形式。但是,在語言之間,所支持的特定語法和功能可能會有所不同。例如,JavaScript,Python和Ruby都支持正則表達式,但它們每個都有自己的獨特語法和功能。
>
>使用正則表達式(REGEX)有什麼含義?雖然正則表達式可能非常強大,但如果不正確使用,它們也可能是資源密集的。複雜的正則表達式可能需要很長時間才能執行,尤其是在大量文本上。因此,必須明智地使用正則表達式並儘可能地優化它們。
>如何優化我的正則表達式(REGEX)?
>有幾種優化正則表達式的策略。其中包括避免使用不必要的量化符,當您不需要匹配的文本時使用非捕捉組,以及在可能的情況下使用字符類而不是交替。此外,某些正則表達引擎提供了優化功能,例如懶量化量,可以提高性能。
> 有哪些資源可以更多地了解正則表達式(REGEX)?可用於了解有關正則表達式的更多信息。其中包括在線教程,書籍和互動學習平台。此外,許多編程語言都有有關其正則表達語法和功能的大量文檔。
>可以使用正則表達式(REGEX)來解析HTML或XML?
>>在技術上可以使用正則表達式時要解析HTML或XML,通常不建議使用。這是因為HTML和XML具有嵌套的結構,該結構可能難以準確地捕獲,以正則表達式。相反,通常最好使用專用的HTML或XML解析器。
>正則表達式(REGEX)有哪些替代方法?根據手頭的任務,您最好使用其他方法。例如,對於簡單的字符串操縱任務,您可以使用內置的字符串方法而不是正則表達式。對於解析HTML或XML,通常會使用專用解析器。對於復雜的文本處理任務,您可能需要考慮使用自然語言處理庫。 >
以上是用實際的例子揭開正面的神秘面紗的詳細內容。更多資訊請關注PHP中文網其他相關文章!