首頁 後端開發 php教程 詳解什麼是正規表示式及其用法

詳解什麼是正規表示式及其用法

Mar 28, 2017 pm 02:54 PM
正規表示式

1.正規表示式是什麼

正規表示式(regular expression)描述了一個字串匹配的模式,可以用來:含有符合某個

(1) 檢查一個字串中是否含有符合某個規則的字串,並且可以得到這個字串;

(2) 根據符合規則對字串進行靈活的替換操作。

正規表示式學習起來其實是很簡單的,不多的幾個較為抽象的概念也很容易理解。之所以很多人感覺正規表示式比較複雜,一方面是因為大多數文檔沒有做到由淺入深的講解,概念上沒有註意先後順序,給對著的理解帶來困難;另一方面,各種引擎自帶的文檔一般都要介紹它特有的功能,然而這部分特有的功能並不是我們首先要理解的。

相關課程:布林教育正規表示式影片教學


2 .正規表示式怎麼用

2.1 普通字元

字母、數字、漢字、底線、以及後邊章節中沒有特殊定義的標點符號,都是普通字元。表達式中的普通字符,在匹配一個字串的時候,匹配與之相同的一個字符。

範例1:表達式 c ,在匹配字串 abcdef 時,匹配結果是:成功;匹配到的內容是:c ;匹配到的位置是:開始於2,結束於3。 (註:下標從0開始還是從1開始,因目前程式語言的不同而可能不同)。

範例2:表達式 bcd ,在匹配字串 abcde 時,匹配結果是:成功;匹配到的內容是:bcd ;匹配到的位置是:開始於1,結束於4。

2.2 簡單的轉義字符

#一些不便書寫的字符,採用前面加 \ 的方法。這些字符其實我們都已經熟知了。

詳解什麼是正規表示式及其用法

還有其他一些在後邊章節中有特殊用處的標點符號,前面加上 \ 後,就代表符號本身。例如:^,$ 都有特殊意義,如果想要皮詬字串中的 ^ 和 $ 字符,正規表示式就需要寫成 \^ 和 \$ 。

詳解什麼是正規表示式及其用法

這些轉義字元的匹配方法與 普通字元 是類似的。也是匹配與之相同的字元。

範例:表達式 \$d ,在符合字串 abc$de 時,配對結果是:成功;符合的內容是:$d ;符合到的位置是:開始於3,結束於5.

2.3 能夠與'多種字元' 匹配的表達式

正規表示式中的一些表示方法,可以匹配 多種字符 其中的任一個字符。例如,表達式 \d 可以符合任一個數字。雖然可以匹配其中任意字符,但只能是一個,不是多個。這就好比玩撲克牌的時候,大小王可以代替任一張牌,但是中能代替一張牌。

詳解什麼是正規表示式及其用法

範例1:表達式 \d\d ,在配對 abc123 時,配對結果為:成功;符合的內容為:12 ;符合的位置是:開始於3,結束於5.

舉例2:表達式 a.\d ,在配對 aaa100 ,配對結果為:成功;配對的內容為: aa1 ;符合的位置是:開始於1,結束於4。

2.4 自訂能夠匹配'多種字符'的表達式

#使用方括號 [] 包含一系列字符,並且能夠匹配其中任意一個字元。用 [^] 包含一系列字符,則能夠匹配其中字符之外的任意一個字符。同樣的道理,雖然可以匹配其中任一個,但是只能是一個,不是多個。

詳解什麼是正規表示式及其用法

範例1:表達式 [bcd][bcd] 配對 abc123 時,配對的結果是:成功;配對的內容為:bc ;符合的位置是:開始於1,結束於3。

範例2:表達式 [^abc] 配對 abc123 時,配對的結果是:成功;符合的內容是:1 ;符合的位置是:開始於3,結束於4。

2.5 修飾符合次數的特殊符號

#

前面章節中講到的表達式,無論是只能符合一種字元的表達式,或是可以符合多種字元的表達式,都只能符合一次。如果使用表達式再加上修飾符合次數的特殊符號,那麼不用重複書寫表達式就可以重複配對。

使用方法是:「次數修飾」放在被修飾的表達式的後面。例如:[bcd][bcd] 可以寫成 [bcd]{2} 。

詳解什麼是正規表示式及其用法

舉例1:表達式 \d+/.?\d* 在符合 it costs $12.5 時,符合的結果是:成功;符合的內容是:12.5 ;配對到的位置是:開始於10,結束於14。

範例2:表達式 go{2, 8}gle 在符合 Ads by goooooogle 時,配對的結果是:成功;符合的內容是:goooooogle ;符合的位置是:開始於7,結束於17。

2.6 其他一些代表抽象意義的符號

#有些符號在表達式中代表抽象的特殊意義:

詳解什麼是正規表示式及其用法

進一步的文字說明仍然比較抽象,因此,舉例幫助大家理解。

範例1:表達式 ^aaa 在符合 xxx aaa xxx 時,配對的結果是:失敗。因為 ^ 要求與字串開始的地方匹配,因此只有當 aaa 位於字串開頭的時候,^aaa 才能匹配,例如:aaa xxx xxx 。

範例2:表達式 aaa$ 在符合 xxx aaa xxx 時,配對結果為:失敗。因為 $ 要求與字串結束的地方匹配,因此,只有當 aaa 位於字串的結尾的時候,aaa$ 才能匹配,例如:xxx xxx aaa 。

範例3:表達式 .\b. 在配對 @@@abc 時,配對結果為:成功;符合的內容是:@a ;符合的位置是:開始於2,結束於4。

進一步說明:\b 與 ^ 和 $ 類似,本身不符任何字符,但是它要求它在匹配結果中所處位置的兩邊,其中一邊是 \w 範圍,另一邊是非 \w 範圍。

範例4:表達式 \bend\b 在符合 weekend,endfor,end 時,配對結果是:成功;配對的內容是:end ;符合到的位置是:開始於15,結束於18。

一些符號會影響表達式內部子表達式之間的關係:

詳解什麼是正規表示式及其用法

#範例5:表達式 Tom|Jack 在符合字串 I' m Tom,he is Jack 時,匹配結果是:成功;匹配到的內容是:Tom;匹配到的位置是:開始於4,結束於7.匹配下一個時,匹配結果是:成功;匹配到的內容是:Jack ;配對到的位置是:開始於15,結束於19。

範例6:表達式 (go\s*)+ 在符合 Let's go go go! 時,配對結果為:成功;配對的內容為:go go go ;符合的位置是:開始於6,結束於14。

範例7:表達式 ¥(\d+\.?\d) 在配對 $10.9,¥20.5 時,配對的結果是:成功;符合的內容為:¥20.5 ;符合的位置是:開始於6,結束於10。單獨取得括號範圍所符合的內容是:20.5 。


3.正規表示式中的一些高階用法

3.1 配對次數中的貪婪與非貪婪

#貪婪模式:

##在使用修飾配對次數的特殊符號時,有幾種表示方法可以同時使同一個表達式能夠匹配不同的次數,例如:”{m, n}” ,”{m,}” ,? ,* ,+ ,具體匹配次數隨被匹配的字串而定。這種重複匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配。例如,針對文本 dxxxdxxxd ,舉例如下:

詳解什麼是正規表示式及其用法

#由此可見,\w+ 在匹配的時候,總是盡可能多的匹配符合它規則的字符。雖然第二個舉例中,它沒有符合最後一個 d ,但那也是為了讓整個表達式匹配成功。同理,帶 * 和 “{m, n}” 的表達式都是盡可能多的匹配,帶 ? 的表達式在可匹配可不匹配的視乎,也是盡可能的 “要匹配” 。這種匹配原則就叫做 貪婪 模式。

非貪婪模式

在修飾匹配次數的特殊符號後再加上 ? 號,則可以使匹配次數不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的 “不匹配” 。這種配對原則叫做 非貪婪 模式,也叫作 勉強 模式。若果少匹配就會導致整個正規表示式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個正則表達式匹配成功。舉例如下,針對文字「dxxxdxxxd」 舉例:

詳解什麼是正規表示式及其用法

#更多的情況,舉例如下:

舉例1:表達式 

(. *) 與字串 

aa

bb

</td>結果是:成功;配對的內容是:

aa

bb

,表達式中的  將與字串中最後一個  配對。

舉例2:相較之下,表達式 

(.*) 匹配舉例1中同樣的字串是,只會得到 

aa

 ,再配對下一個時,可以得到第二個 

bb

 。

3.2 反向引用\1,\2…

#表達式在符合時,表達式引擎會將小括號 () 包含的表達式所匹配到的字串記錄下來。在取得符合結果的識貨,小括號包含的表達式所符合的字串可以單獨火球。這一點,在前面的舉例中,已經多次展示了。在實際應用場合中,當用某種邊界來查找,而索取的內容又不包含邊界時,必須使用小括號來指定所要的範圍。例如前面的 

(.*?) 。

其實,」小括號包含的表達式所符合的字串」 不只是在符合結束之後才可以使用,在符合過程中也可以使用。表達式後邊的部分,可以引用前面 “括號內的子符合已經符合的字串” 。引用方法是 \ 加​​上一個數字。 \1引用第1對括號內符合的字串,\2 引用第2對括號內符合的字串…以此類推,如果一對括號內包含另一對括號,則外層的括號先排序號。換句話說,哪一對的左括號 ( 在前,那這一對就先排序號。

舉例1:表達式 ('|")(.*?)(/1) 在匹配'Hello',"World" 時,配對的結果是:成功;配對到的內容是:'Hello' 。 (\w)\1{4,} 在符合 aa bbbb abcdefg ccccc 111121111 999999999 時,配對結果為:成功;符合的內容為:cccccc 。範圍的字元至少重複5次,注意與 \w{5,} 之間的差異。 ).*?\4)?\s*)*>.*?/1> 在匹配 

 時,配對結果是:成功。搜索,不匹配;反向預搜索,不匹配

前邊的章節中,我講到了幾個代表抽象意義的特殊符號:^ ,$ ,\b 。有一個共同點,那就是:它們本身不匹配任何字符,只是對“字符串的兩頭” 或者“字符之間的縫隙” 附加了一個條件。對「兩頭」 或「縫隙」 附加條件的,更靈活的方法。

格式:(?=xxxxx) ,在符合的字串中,它對所處的「縫隙」 或「兩頭」 附加條件是:所在縫隙的右側,必須能夠匹配上 xxxxx 這部分的表達式。因為它只是在此作為這個縫隙上附加的條件,所以它並不影響後面表達式去真正匹配這個縫隙之後的字元。這就類似 \b​​ ,本身不符合任何字元。 \b 只是將所在縫隙之前、之後的字元取來進行了一下判斷,不會影響後邊的表達式來真正的匹配。

範例1:表達式 Windows(?=NT|XP) 在符合 Windows 98 ,Windows NT ,Windows 2000 時,只會符合Windows NT 中的 Windows ,而其他的 Windows 則則不會被符合。

範例2:表達式 (\w)((?=\1\1\1)(\1))+ 在符合字串 aaa ffffff 9999999999 時,將可與6個 f 的前4個,可以配對9個 9 前7個。這個表達式可以解讀成:重複4次以上的字母 數字,則符合剩下最後2位元之前的部分。當然,這個表達式可以不這樣寫,在此的目的是作為演示之用。

格式:(?!xxxxx) ,所在縫隙的右側,必須無法符合 xxxxx 這部分錶達式。

範例3:表達式 ((?!\bstop\b).)+ 在符合 fdjka ljfdl stop fjdsla fdj 時,將從頭一直配對到 stop 之前的位置,如果字串中沒有 stop ,則將從頭開始配對到 stop 之前的位置,如果字串中沒有 stop ,則將匹配整個字串。

範例4:表達式 do(?!\w) 在符合字串 done,do,dog 時,只能符合 do 。在本條舉例中,do 後邊使用(?!\w) 和使用 \b 效果是一樣的。

反向預搜尋: (?

這兩種格式的概念和正向預搜尋是類似的,反向預搜尋要求的條件是:所在縫隙的「左側」 ,兩種格式分別要求必須能夠匹配和必須不能夠匹配指定的表達式,而不是去判斷右側。與 「正向預搜尋」 一樣的是它們都是對所在縫隙的一種附加太偶見,本身都不符合任何字元。


4.其他通用規則

4.1 規則一

表達式中,可以使用\xXX 和\uXXXX 表示一個字元(X 表示一個十六進位數)

詳解什麼是正規表示式及其用法

4.2 規則二

在表達式\s ,\d ,\w ,\b 表示特殊意義的同時,對應的大寫字母表示相反的意義

1詳解什麼是正規表示式及其用法

4.3 規則三

在表達式中有特殊意義,需要新增\ 才能符合該字元本身的字元總表

1詳解什麼是正規表示式及其用法

#4.4 規則四

括號()內的子表達式,若果希望匹配結果不進行記錄供以後使用,可以使用(?:xxxxx) 格式。

舉例1:表達式 (?:(\w)\1)+ 符合 “a bbccdd efg” 時,結果是 “bbccdd” 。括號 (?:) 範圍的符合結果不進行記錄,因此 (\w) 使用 \1 來引用。

4.5 規則五

常用的表達式屬性設定簡介:Ignorecase ,Singleline ,Multiline ,Global

1詳解什麼是正規表示式及其用法

相關文章:

PHP怎麼用正規表示式來匹配圓括號

PHP 正規表示式常用函數使用小結

php正規表示式符合中文字元的簡單程式碼實例

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
PHP正規表示式驗證:數位格式偵測 PHP正規表示式驗證:數位格式偵測 Mar 21, 2024 am 09:45 AM

PHP正規表示式驗證:數位格式偵測在編寫PHP程式時,經常需要對使用者輸入的資料進行驗證,其中一個常見的驗證是檢查資料是否符合指定的數字格式。在PHP中,可以使用正規表示式來實現這種驗證。本文將介紹如何使用PHP正規表示式來驗證數字格式,並提供具體的程式碼範例。首先,讓我們來看看常見的數字格式驗證要求:整數:只包含數字0-9,可以以正負號開頭,不包含小數點。浮點

如何在 Go 中使用正規表示式匹配時間戳記? 如何在 Go 中使用正規表示式匹配時間戳記? Jun 02, 2024 am 09:00 AM

在Go中,可以使用正規表示式比對時間戳記:編譯正規表示式字串,例如用於匹配ISO8601時間戳記的表達式:^\d{4}-\d{2}-\d{2}T \d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ 。使用regexp.MatchString函數檢查字串是否與正規表示式相符。

掌握Go語言的正規表示式和字串處理 掌握Go語言的正規表示式和字串處理 Nov 30, 2023 am 09:54 AM

Go語言作為一門現代化的程式語言,提供了強大的正規表示式和字串處理功能,使得開發者能夠更有效率地處理字串資料。掌握Go語言的正規表示式和字串處理,對於開發者來說是非常重要的。本文將詳細介紹Go語言中正規表示式的基本概念和用法,以及如何使用Go語言處理字串。一、正規表示式正規表示式是用來描述字串模式的工具,能夠方便地實現字串的匹配、尋找和替換等操

如何使用正規表示式在 Golang 中驗證電子郵件地址? 如何使用正規表示式在 Golang 中驗證電子郵件地址? May 31, 2024 pm 01:04 PM

若要使用正規表示式在Golang中驗證電子郵件地址,請執行下列步驟:使用regexp.MustCompile建立正規表示式模式,以符合有效的電子郵件地址格式。使用MatchString函數檢查字串是否與模式相符。此模式涵蓋了大多數有效的電子郵件地址格式,包括:局部使用者名稱可以包含字母、數字和特殊字元:!.#$%&'*+/=?^_{|}~-`網域至少包含一個字母,後面可以跟字母、數字或連字符頂級域名(TLD)不能超過63個字符長

如何在 Go 中使用正規表示式驗證密碼? 如何在 Go 中使用正規表示式驗證密碼? Jun 02, 2024 pm 07:31 PM

Go中使用正規表示式驗證密碼的方法如下:定義正規表示式模式,符合最低密碼要求:至少8個字符,包含小寫字母、大寫字母、數字和特殊字符。使用regexp套件中的MustCompile函式編譯正規表示式模式。使用MatchString方法測試輸入字串是否與正規表示式模式相符。

中文字元過濾:PHP正規表示式實踐 中文字元過濾:PHP正規表示式實踐 Mar 24, 2024 pm 04:48 PM

PHP是一種廣泛應用的程式語言,特別在Web開發領域中非常流行。在網路開發過程中,經常會遇到需要對使用者輸入的文字進行過濾、驗證等操作,其中字元過濾是一項十分重要的操作。本文將介紹如何使用PHP中的正規表示式來實現中文字元過濾的功能,並給出具體的程式碼範例。首先,我們要先明確一下中文字元的Unicode範圍是從u4e00到u9fa5,也就是所有的漢字都處於這個範圍

PHP正規表示式:精確匹配與排除模糊包含 PHP正規表示式:精確匹配與排除模糊包含 Feb 28, 2024 pm 01:03 PM

PHP正規表示式:精確匹配與排除模糊包含正規表示式是一種強大的文字匹配工具,能夠幫助程式設計師在處理文字時進行高效的搜尋、替換和篩選。在PHP中,正規表示式也被廣泛應用於字串處理和資料匹配。本文將重點介紹在PHP中如何進行精確配對和排除模糊包含的操作,同時結合具體的程式碼範例進行說明。精確匹配精確匹配意味著只匹配符合完全條件的字串,不匹配任何變種或包含額外字

PHP傳回一個字串在另一個字串中開始位置到結束位置的字串 PHP傳回一個字串在另一個字串中開始位置到結束位置的字串 Mar 21, 2024 am 10:31 AM

這篇文章將為大家詳細講解有關PHP返回一個字符串在另一個字符串中開始位置到結束位置的字符串,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP中使用substr()函數從字串中擷取子字串substr()函數可從字串中擷取指定範圍內的字元。其語法如下:substr(string,start,length)其中:string:要從中提取子字串的原始字串。 start:子字串開始位置的索引(從0開始)。 length(可選):子字串的長度。如果未指定,則提

See all articles