一直覺得正則表達式很難,平時遇到都是網上copy,最近刷犀牛書的時候看到了正則部分,正好整理下知識點!
1、重復
-
{n, m}: 匹配前一項至少n次,但不能超過m次 比如 /a{2,4}/
image.png -
{n,}: 匹配前一項n次或者更多次 比如 /a{4,}/
image.png -
{n}: 匹配前一項n次 比如 /a{4}/
image.png -
?: 匹配前一項0次或者多次,等價于{0,1} 比如 /a?/
image.png -
+: 匹配前一項1次或多次,等價于 {1,} 比如 /a+/
image.png -
: 匹配前一項0次或多次,等價于{0,} 比如 /a/
image.png
2、選擇
'()'用于把單獨的項組合成子表達式,以便可以像處理一個獨立的單元那樣。
/java(script)?/ 可以匹配‘java’,其后可以有’script’,也可以沒有
3、分組
帶'()'的表達式可以可以被后邊的表達式引用,分組的子表達式有按從左向右遞增的編號,可以通過’\’后邊加編號來對其進行引用,比如'\1'是對第1個分組子表達式的引用,'\n'是對第n個分組子表達式的引用。
比如,/(["'])[^"']*\1/ 是對被單引號或雙引號包裹的內容進行匹配,且要求左右的引號一致,
這里如果用/["'][^"']["']/,并不能保證左右的引號一致。
需要注意的是,引用是指對匹配文本的引用,而不是對模式的引用。
若不想創建帶編號的分組表達式,可以用'(?:)' 替代 '()',
注意,/(?:\w)/ 與 /(\w)/ 的區別,前者沒有分組編號。
4、錨
錨,指的是位置,很多情況下需要指定匹配的位置,最常用的就是 '^' 和 '$'
- ‘^’ 指定匹配字符串的開始
- ’$’ 指定匹配字符串的結束
比較難理解的是 零寬正向先行斷言 和 零寬負向先行斷言
-
’(?=pattern)‘ 表示零寬正向先行斷言,其中’pattern’是一個正則表達式
比如 /Java(?=Script)/,該正則表達式匹配 ‘JavaScript’ 中的 ‘Java’,但不會匹配
‘JavaPcript’ 中的 ‘Java’,也就是說,匹配位置的右邊要匹配pattern這個正則。
image.png
所謂零寬,就是說'(?=pattern)' 中的 'pattern' 不會消耗匹配的字符,
舉個例子
就是說 '/w'匹配到了'Script' 中的 'S',也就是'(?=Script)'沒有消耗掉'Script'。
所謂先行斷言,是指JavaScript引擎先于掃描指針去嘗試匹配后續的字符串。
- '(?!pattern)' 表示零寬負向先行斷言,與零寬正向先行斷言類似,唯一的區別在于前者是不匹配pattern。
其實還有 零寬正向后行斷言 和 零寬負向后行斷言,不過JavaScript并不支持。
5、'\b' 與 '\B'
\b 匹配一個單詞,所謂單詞,就是指\w組成的字符串,也就是說,\b匹配的是\w與\W
之間的位置