三分鐘搞懂正則之反向引用和零寬斷言

反向引用

上一期講到了反向引用,那什麼是反向引用,我們先來看一個demo
clipboard.png

其中1, 2的語法就叫做反向引用,他們分別表示捕獲到的第一個,第二個內容,最多可以使用到9,表示捕獲到的第9個內容。
注意引用的,是捕獲到的內容,而不是捕獲規則。所以(\w)(\w)\1\2 表示的就是一個xyxy的結構,因此匹配到了"cdcd"
下面舉幾個小栗子:

  • 判斷字符串中有沒有連續重複字符
    clipboard.png
  • 縮寫16進制顏色值

    clipboard.png

零寬斷言

斷言又有很多中叫法,比如環視,巡視。斷言一共又分4種:

  1. x(?=y) 匹配‘x’僅僅當‘x’後面跟着‘y’.這種叫做先行肯定斷言。
  2. (?<=y)x 匹配‘x’僅僅當‘x’前面是‘y’.這種叫做後行肯定斷言。
  3. x(?!y) 僅僅當‘x’後面不跟着‘y’時匹配‘x’,這被稱爲正向否定斷言。
  4. (?<!y)x 僅僅當‘x’前面不是‘y’時匹配‘x’,這被稱爲反向否定斷言。

不同語言叫法不同,先行後行,正向反向都是一個意思。

clipboard.png

clipboard.png

零寬可以理解位它表示的是一個位置,而不是內容。
正則中表示位置的元字符有\b ^ $等等,它們也都是零寬的。
上面的兩個demo,如果不用零寬斷言,則會將整個字符串給替換掉。
下面也舉幾個零寬斷言的例子:

  • 密碼規則:大寫,小寫,數字,特殊字符必須有一個,長度8到12位

    clipboard.png

這段正則可以看到,先行斷言前面的匹配項是^,幾個斷言分別表示,從頭開始,不管中間經歷了啥,始終有一個小寫英文字母/大寫英文字母/數字,特殊字符。
後面的[^\s]{8,12}表示長度8到12的非空字符。要注意的是,這裏的斷言,匹配的不是後面的8到12位字符,而是滿足斷言條件的開頭^

  • 金額千分位分隔符

    clipboard.png

正則只能從前往後匹配,這裏表示如果一個數字後面跟着的數字,每三個一組,到小數點剛好分完,則需要加入分隔符。

以上就是正則的反向引用和零寬斷言了,是不是很簡單?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章