正規表示式入門 下 分組和斷言

2021-10-01 21:14:11 字數 3111 閱讀 6534

為什麼這裡寫的是元素而不是字元呢?

這就要引入分組的概念了, 使用()將一塊表示式括起來, 可以把這個整體當做乙個元素處理

例如(ab)?可以將兩個字元ab作為乙個整體看待,這時量詞?表示的就是ab作為整體,要麼一起出現,要麼一起不出現

/^(ab)+$/

.test

('abab'

)//true/^

(ab)

+$/.

test

('aba'

)//false

多選結構

多選結構形式為(...|...),即在括號內用豎線分隔多個子表示式, 可以用於表達的概念

|被用在最外層時,相當於將整個表示式視為乙個多選結構 ,即ab|cd等價於(ab|cd)

通過這個正規表示式視覺化的**,可以方便的檢視效果

表示式1(ab|cd)2,視覺化結果如下:

反向引用 (back reference)

通過()括起來的分組中匹配到的內容會被保留下來,可以在後面的表示式中引用到被匹配到的文字,形式為\num(這是js中的表示法,其他語言可能有所區別)

注意: 有多處分組時數字編號是以表示式中左括號出現順序依次排列的

例如:

/(\d)-(\d)-(\d) \1-\2-\3/

.test

('2020-01-02 2020-01-02'

)//true

/(\d)-

(\d)

-(\d

) \1

-\2-\3/.

test

('2020-01-02 2020-01-03'

)//false

(\d)-(\d)-(\d) \1-\2-\3對應的視覺化:

在字串替換中,也可以在第二個引數中引用第乙個引數裡的分組,不過形式變為$num(js語法)

'2020-01-02'

.replace

(/(\d)-(\d)-(\d)/

,'$1年 $2月 $3日'

)//2023年 01月 02日"

非捕獲分組

使用正常的()分組會把括號中子表示式匹配的內容暫時儲存起來,如果用不著反向引用的功能,會影響正規表示式的效能;

為此,正規表示式提供了非捕獲分組功能,非捕獲分組只用於限定量詞作用範圍,不會捕獲文字內容.

形式為將(...)改為(?:...), 碰到非捕獲分組時編號不會遞增

/(\d)-(\d)-(\d) \1-\2-\3/

.test

('2020-01-02 2020-01-02');

//true/(

?:\d)-

(\d)

-(\d

) \1

-\2/

.test

('2020-01-02 01-02');

//true 年份使用了(?:)被略過

一般來說,如果不使用反向引用功能的話,盡量使用非捕獲分組

命名分組

僅依靠編號\1 \2 \3這樣引用分組容易導致混亂,可以使用命名分組實現類似變數的功能,語法為\k,在replace中則是$

//反向引用/(

?\d)-

(\d)

-(\d

) \k

-\2-\3/.

test

('2020-01-02 2020-01-02'

)//true

//match

'2020-01-02'

.match

(/(?\d)-(?\d)-(?\d)/

).groups;

////replace

'2020-01-02'

.replace

(/(?\d)-(\d)-(\d)/

,'$年 $2月 $3日'

)//"2023年 01月 02日"

斷言只用來判斷某個位置左側/右側的文字是否符合要求,本身並不匹配內容,常見的有單詞邊界、行起始/結束位置、環視這三類。

單詞邊界

匹配一邊是單詞字元,另一邊不是單詞字元的位置 (單詞字元指的是\w能夠匹配的字元)符號為\b,示例如下

行起始/結束位置 環視

​ 環視用來表示: 在某個位置向左/右看,必須或不能出現指定的字元。與單詞邊界類似,環視本身不匹配字元。

名稱記法

方向能否出現

匹配字元

肯定順序環視

(?=…)

->true

否定順序環視

(?!..)

->false

肯定逆序環視

(?<=…)

true

否定逆序環視

(?false

示例: xshell中高亮當前路徑,可以使用肯定逆序環視(?<=root@debian:).*?#標記出root@debian:/home#中的路徑/home

正規表示式分組 斷言詳解

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

正規表示式分組 斷言詳解

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

正規表示式中的分組斷言

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