為什麼這裡寫的是元素而不是字元呢?
這就要引入分組的概念了, 使用()
將一塊表示式括起來, 可以把這個整體當做乙個元素處理
例如(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原始碼中有 標籤,用以前的知識,我們只能確定原始碼中的和是固定不變的。因...