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

反向引用

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

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

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

    clipboard.png

零寬斷言

斷言又有不少中叫法,好比環視,巡視。斷言一共又分4種:code

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

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

clipboard.png

clipboard.png

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

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

    clipboard.png

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

  • 金額千分位分隔符

    clipboard.png

正則只能從前日後匹配,這裏表示若是一個數字後面跟着的數字,每三個一組,到小數點恰好分完,則須要加入分隔符。it

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

相關文章
相關標籤/搜索