魔芋:
01,小括號(又稱爲圓括號)會產生子表達式(又稱爲分組,子串)。能夠在正則中\1,\2來引用子表達式匹配的文本值。
這些子表達式會被臨時緩衝區緩存起來。
所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。
緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用
'\n'
訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。如\1,\2。
n又稱爲分組號。
好處,能夠不用重複查找某個匹配項。
這種方式,又稱爲反向引用。
這種又稱爲捕獲分組。
02,用(?:n)能夠消除小括號產生子表達式的效果。
03,
能夠使用非捕獲元字符 '?:'、'?=' 或 '?!' 來重寫捕獲,忽略對相關匹配的保存。
叫作:預測先行的匹配。
又叫作:非捕獲組(non-capturing)
|
選擇,匹配的是該符號左邊的子表達式或右邊的子表達式。
捕獲
(exp)
用小圓括號進行分組,如日期中年月日的分組:/(\d{5})-(\d{1,2})-(\d{1,2})/
每一個分組將產生分組號,從第一個括號開始,能夠使用\n的形式在正則中使用分組號。
如匹配成對出現的HTML標籤,能夠寫成:/<(\w+)><\/\1>/。
能夠記住和這個組合相匹配的字符串以供此後的引用使用。
(?:exp)
匹配exp正則,但不產生分組號,不記憶與該組匹配的字符
(?<name>exp)
匹配exp,並捕獲文本到名稱爲name的組裏,也能夠寫成(?'name'exp)
零寬斷言:
exp1(?=exp2)
前瞻斷言,匹配exp1,但後面必須是exp2。又稱爲
先行斷言
。
零寬度正預測先行斷言
如匹配名字叫xianlie,但不姓zhao的人:/zhao(?=xianlie)/
exp1(?!=exp2)
後瞻斷言,匹配exp1,但後面不能是exp2。又稱爲
負向先行斷言。先行否認斷言。
如匹配姓zhao,但名字不叫xianlie的人:/zhao(?!xianlie)/
好比
\b\w+(?=ing\b)
,匹配
以ing結尾的單詞的前面部分(除了ing之外的部分)
,如查找
I'm singing while you're dancing.
時,它會匹配
sing
和
danc
。
(?<exp)正則表達式
來自ES7。緩存
後行斷言:與」先行斷言」相反, x只有在y後面才匹配,必須寫成/(?<=y)x/
。解釋:找一個x,那個x的前面要有y。編碼
又叫作:零寬度正回顧後發斷言spa
好比(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re之外的部分),例如在查找reading a book時,它匹配ading。3d
(?<!exp)code
來自ES7。
後行否認斷言: 與」先行否認斷言「相反,x只有不在y後面才匹配,必須寫成/(?<!y)x/
。 解釋:找一個x,那個x的前面沒有y。orm
能夠看出,後行斷言先匹配/(?<=y)x/的x,而後再回到左邊,匹配y的部分,即先右後左」的執行順序。blog
又叫作:
零寬度負預測先行斷言
例如:
\d{3}(?!\d)
匹配
三位數字,並且這三位數字的後面不能是數字
;
\b((?!abc)\w)+\b
匹配
不包含連續字符串abc的單詞
。
(?<![a-z])\d{7}
匹配
前面不是小寫字母的七位數字
。
\n
和第n個分組第一次匹配的字符相匹配,組是圓括號的子表達式(也有多是嵌套的),組索引是從左到右的左括號數,「(?:形式的分組不編碼