反向引用
上一期講到了反向引用,那什麼是反向引用,我們先來看一個demo
其中1, 2的語法就叫做反向引用,他們分別表示捕獲到的第一個,第二個內容,最多可以使用到9,表示捕獲到的第9個內容。
注意引用的,是捕獲到的內容,而不是捕獲規則。所以(\w)(\w)\1\2
表示的就是一個xyxy
的結構,因此匹配到了"cdcd"
。
下面舉幾個小栗子:
- 判斷字符串中有沒有連續重複字符
- 縮寫16進制顏色值
零寬斷言
斷言又有很多中叫法,比如環視,巡視。斷言一共又分4種:
- x(?=y) 匹配‘x’僅僅當‘x’後面跟着‘y’.這種叫做先行肯定斷言。
- (?<=y)x 匹配‘x’僅僅當‘x’前面是‘y’.這種叫做後行肯定斷言。
- x(?!y) 僅僅當‘x’後面不跟着‘y’時匹配‘x’,這被稱爲正向否定斷言。
- (?<!y)x 僅僅當‘x’前面不是‘y’時匹配‘x’,這被稱爲反向否定斷言。
不同語言叫法不同,先行後行,正向反向都是一個意思。
零寬可以理解位它表示的是一個位置,而不是內容。
正則中表示位置的元字符有\b ^ $
等等,它們也都是零寬的。
上面的兩個demo,如果不用零寬斷言,則會將整個字符串給替換掉。
下面也舉幾個零寬斷言的例子:
- 密碼規則:大寫,小寫,數字,特殊字符必須有一個,長度8到12位
這段正則可以看到,先行斷言前面的匹配項是^
,幾個斷言分別表示,從頭開始,不管中間經歷了啥,始終有一個小寫英文字母/大寫英文字母/數字,特殊字符。
後面的[^\s]{8,12}
表示長度8到12的非空字符。要注意的是,這裏的斷言,匹配的不是後面的8到12位字符,而是滿足斷言條件的開頭^
,
- 金額千分位分隔符
正則只能從前往後匹配,這裏表示如果一個數字後面跟着的數字,每三個一組,到小數點剛好分完,則需要加入分隔符。
以上就是正則的反向引用和零寬斷言了,是不是很簡單?