正規表示式基本用法(二) 斷言 分組

2021-08-09 02:44:59 字數 2077 閱讀 8077

斷言:**

也叫零寬度正**先行斷言(?=表示式)          表示匹配表示式前面的位置 

例如 [a-z]*(?=ing) 可以匹配cooking singing 中的cook與sing 

注意:先行斷言的執行步驟是這樣的先從要匹配的字串中的最右端找到第乙個ing(也就是先行斷言中的表示式)然後 再匹配其前面的表示式,若無法匹配則繼續查詢第二個ing 再匹配第二個 ing前面的字串,若能匹配 則匹配

例如:.*(?=ing) 可以匹配cooking singing 中的cooking sing 而不是 cook 

也叫零寬度正回顧後發斷言        (?<=表示式)   表示匹配表示式後面的位置 

例如(?<=abc).* 可以匹配abcdefg中的defg        

注意:後發斷言跟先行斷言恰恰相反 它的執行步驟是這樣的:先從要匹配的字串中的最左端找到第乙個abc(也就是先行斷言中的表示式)然後 再匹配其後面的表示式,若無法匹配則繼續查詢第二個abc 再匹配第二個abc後面的字串,若能匹配 則匹配

例如(?<=abc).* 可以匹配abcdefgabc中的defgabc 而不是abcdefg 

負向零寬斷言 (?!表示式) 也是匹配乙個零寬度的位置,不過這個位置的「斷言」取表示式的反值,例如 (?!表示式) 表示 表示式 前面的位置,如果 表示式 不成立 ,匹配這個位置;如果 表示式 成立,則不匹配:同樣,負向零寬斷言也有「先行」和「後發」兩種,負向零寬後發斷言為 (?

例子——驗證密碼的強度**自:

驗證密碼的強度。密碼必須包含下面數字+小寫字母+大寫字母且長度要求8-20位。

長度直接可以判斷,但是數字+小寫字母+大寫字母這個就要用正則來解決了。首先想到就是判斷次分別用\d+,[a-z]+,[a-z]來判斷,這三個正則同時滿足就是達到強度要求。後來想到有沒有用乙個正則就能完成判斷的,其實是可以的,但是就是比較複雜,其中涉及到正規表示式中的斷言和分組這些高階知識。下面給出最終的正規表示式:

^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[a-z].*).$

分組(用括號括起來):

舉個例子,比如html原始碼中有***標籤,用以前的知識,我們只能確定原始碼中的和是固定不變的。因此,如果想獲取頁面標題(***),充其量只能寫乙個類似於這樣的表示式:.*,而這樣寫匹配出來的是完整的***標籤,並不是單純的頁面標題***。

想解決以上問題,就要用到斷言知識。

在講斷言之前,讀者應該先了解分組,這有助於理解斷言。

分組在正則中用()表示,根據小菜理解,分組的作用有兩個:

n  將某些規律看成是一組,然後進行組級別的重複,可以得到意想不到的效果。

n  分組之後,可以通過後向引用簡化表示式。

\d.\d.\d.\d

但仔細觀察,我們可以發現一定的規律,可以把.\d看成乙個整體,也就是把他們看成一組,再把這個組重複3次即可。表示式如下:

\d(.\d)

這樣一看,就比較簡潔了。

再來看第二個作用,就拿匹配***標籤來說,簡單的正則可以這樣寫:.*

可以看出,上邊表示式中有兩個title,完全一樣,其實可以通過分組簡寫。表示式如下:

<(title)>.*

這個例子實際上就是反向引用的實際應用。對於分組而言,整個表示式永遠算作第0組,在本例中,第0組是<(title)>.*,然後從左到右,依次為分組編號,因此,(title)是第1組。

用\1這種語法,可以引用某組的文字內容,\1當然就是引用第1組的文字內容了,這樣一來,就可以簡化正規表示式,只寫一次title,把它放在組裡,然後在後邊引用即可。

(\d)(.\1)

簡單的解釋下,把\d放在一組裡,表示為(\d),它是第1組,(.\1)是第2組,在第2組裡通過\1語法,後向引用了第1組的文字內容

經過實際測試,會發現這樣寫是錯誤的,為什麼呢?

小菜一直在強調,後向引用,引用的僅僅是文字內容,而不是正規表示式

也就是說,組中的內容一旦匹配成功,後向引用,引用的就是匹配成功後的內容,引用的是結果,而不是表示式

正規表示式分組 斷言詳解

正規表示式中的斷言,作為高階應用出現,倒不是因為它有多難,而是概念比較抽象,不容易理解而已,今天就讓小菜通俗的講解一下。如果不用斷言,以往用過的那些表示式,僅僅能獲取到有規律的字串,而不能獲取無規律的字串。舉個例子,比如html原始碼中有 標籤,用以前的知識,我們只能確定原始碼中的和是固定不變的。因...

正規表示式分組 斷言詳解

正規表示式中的斷言,作為高階應用出現,倒不是因為它有多難,而是概念比較抽象,不容易理解而已,今天就讓小菜通俗的講解一下。如果不用斷言,以往用過的那些表示式,僅僅能獲取到有規律的字串,而不能獲取無規律的字串。舉個例子,比如html原始碼中有 標籤,用以前的知識,我們只能確定原始碼中的和是固定不變的。因...

正規表示式中的分組斷言

正規表示式中的斷言,作為高階應用出現,倒不是因為它有多難,而是概念比較抽象,不容易理解而已,今天就讓小菜通俗的講解一下。如果不用斷言,以往用過的那些表示式,僅僅能獲取到有規律的字串,而不能獲取無規律的字串。舉個例子,比如html原始碼中有 標籤,用以前的知識,我們只能確定原始碼中的和是固定不變的。因...