三. 分組 ()
在上一篇文章中 的量詞部分說到, 量詞的一般形式爲{m,n}
,用於限定{}
前面的 元素 出現的次數
爲什麼這裏寫的是元素而不是字符呢?
這就要引入 分組 的概念了, 使用()
將一塊表達式括起來, 可以把這個整體當做一個元素處理
例如(ab)?
可以將兩個字符ab作爲一個整體看待,這時量詞?
表示的就是ab
作爲整體,要麼一起出現,要麼一起不出現
/^(ab)+$/.test('abab') //true
/^(ab)+$/.test('aba') //false
多選結構
多選結構形式爲(...|...)
,即在括號內用豎線分隔多個子表達式, 可以用於表達或
的概念
當|
被用在最外層時,相當於將整個表達式視爲一個多選結構 ,即ab|cd
等價於(ab|cd)
通過這個正則表達式可視化的網站,可以方便的查看效果
表達式 1(ab|cd)2
,可視化結果如下:
反向引用 (Back reference)
通過()括起來的分組中匹配到的內容會被保留下來,可以在後面的表達式中引用到被匹配到的文本,形式爲\num
(這是js中的表示法,其他語言可能有所區別)
注意: 有多處分組時數字編號是以表達式中左括號出現順序依次排列的
例如:
/(\d{4})-(\d{2})-(\d{2}) \1-\2-\3/.test('2020-01-02 2020-01-02') //true
/(\d{4})-(\d{2})-(\d{2}) \1-\2-\3/.test('2020-01-02 2020-01-03') //false
(\d{4})-(\d{2})-(\d{2}) \1-\2-\3
對應的可視化圖片:
在字符串替換中,也可以在第二個參數中引用第一個參數裏的分組,不過形式變爲$num
(js語法)
'2020-01-02'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$1年 $2月 $3日')
//2020年 01月 02日"
非捕獲分組
使用正常的()
分組會把括號中子表達式匹配的內容暫時存儲起來,如果用不着反向引用的功能,會影響正則表達式的性能;
爲此,正則表達式提供了非捕獲分組功能,非捕獲分組只用於限定量詞作用範圍,不會捕獲文本內容.
形式爲將(...)
改爲(?:...)
, 碰到非捕獲分組時編號不會遞增
/(\d{4})-(\d{2})-(\d{2}) \1-\2-\3/.test('2020-01-02 2020-01-02'); //true
/(?:\d{4})-(\d{2})-(\d{2}) \1-\2/.test('2020-01-02 01-02'); //true 年份使用了(?:)被略過
一般來說,如果不使用反向引用功能的話,儘量使用非捕獲分組
命名分組
僅依靠編號\1 \2 \3
這樣引用分組容易導致混亂,可以使用命名分組實現類似變量的功能,語法爲\k<name>
,在replace中則是$<name>
//反向引用
/(?<year>\d{4})-(\d{2})-(\d{2}) \k<year>-\2-\3/.test('2020-01-02 2020-01-02') //true
//match
'2020-01-02'.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/).groups;
//{year: "2020", month: "01", day: "02"}
//replace
'2020-01-02'.replace(/(?<year>\d{4})-(\d{2})-(\d{2})/,'$<year>年 $2月 $3日')
//"2020年 01月 02日"
四. 斷言
斷言只用來判斷某個位置左側/右側的文本是否符合要求,本身並不匹配內容,常見的有單詞邊界、行起始/結束位置、環視這三類。
單詞邊界
匹配一邊是單詞字符,另一邊不是單詞字符的位置 (單詞字符指的是\w
能夠匹配的字符)符號爲\b
,示例如下
行起始/結束位置
^
起始位置$
終止位置
環視
環視用來表示: 在某個位置向左/右看,必須或不能出現指定的字符。與單詞邊界類似,環視本身不匹配字符。
名稱 | 記法 | 方向 | 能否出現 匹配字符 |
---|---|---|---|
肯定順序環視 | (?=…) | -> |
true |
否定順序環視 | (?!..) | -> |
false |
肯定逆序環視 | (?<=…) | <- |
true |
否定逆序環視 | (?<!..) | <- |
false |
<
表示逆序,沒有則表示順序=
/!
:肯定/否定
示例: xshell中高亮當前路徑,可以使用肯定逆序環視(?<=root@debian:).*?#
標記出root@debian:/home#
中的路徑/home