正則表達式入門(下)---分組和斷言

三. 分組 ()

上一篇文章中 的量詞部分說到, 量詞的一般形式爲{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

發佈了9 篇原創文章 · 獲贊 0 · 訪問量 3340
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章