JavaScript中的正則內容說多其實也很少,但要全面完全掌握,也須要花費一些精力。本文的內容不會詳細全面講解,那會是一個頗爲龐大的工程。會試着從一些重要概念的角度,梳理一下正則中須要掌握的經常使用的知識點。正則表達式
元字符是正則表達式中具備特殊含義的字符,這些字符沒法用來表明它們本身自己。例如*號在正則中並不表明*號自己,而表示匹配任意字符。常見的正則元字符以下。bash
\w 匹配單詞字符
\W 匹配非單詞字符
\d 匹配數字
\D 匹配非數字
\s 匹配空格
\S 匹配非空格
\b 匹配單詞邊界
\B 匹配非單詞邊界
\n 匹配換行符號
\r 匹配回車
\ 正則中用於轉義
^ 匹配字符串開頭
$ 匹配字符串結尾
複製代碼
字符類指的是使用元字符'[]'構建的一個匹配範圍。例如: /[abcde]/g;表明的是匹配abcde這些字符中的任意一個。 還有一種是反向字符類,表明的是匹配除了字符類中出現的字符之外的任意字符,例如: /[^abc]/g;表明的是匹配除了abc意外任意的字符。ui
量詞的功能是在正則表達式中匹配字符重複出現的次數。主要有spa
? 匹配字符出現零次或者一次,最多一次
+ 匹配字符出現一次或屢次,至少一次
* 出現任意次,零次或者無數次
{n,m} 匹配出現n次到m次的字符,包括n和m
複製代碼
正則中使用元字符()來進行分組,分組的內容能夠進行捕獲,並在正則中重用。code
let reg = /(\d{4})-\1/g;
複製代碼
例如在上述正則表達式中,括號內匹配4個數字就是一個分組,而這個分組匹配到的內容,能夠在後續的正則表達式中利用,在這個正則中就是'\1',表示等同於第一個分組。 固然有些狀況下,咱們不但願某些分組被捕獲,若是須要某些分組不被捕獲,能夠在分組的開始位置加上'?:'。例如。ip
let reg = /(\d{5})-(?:\d{3})-(\d{1})/g;
複製代碼
上述正則中第二個分組就不會被捕獲,後續正則中'\2'引用分組,表明的是(\d{1})這個分組中捕獲的內容。字符串
正則中的量詞默認是貪婪模式,也就是說會盡量多的匹配符合要求的字符。例如string
let str = 'ababababababab';
let reg = /(ab){3,5}/g;
str.replace(reg, 'M'); // Mabab
複製代碼
在能夠匹配3個到5個ab的狀況下,默認的貪婪模式匹配了5個。
在量詞後面加上?可讓正則轉爲非貪婪模式。一樣的例子。class
let str = 'ababababababab';
let reg = /(ab){3,5}?/g;
str.replace(reg, 'M'); // "MMab"
複製代碼
正向斷言指定了一個必須匹配但不在結果中返回的模式。一個向前查找模式其實就是一個以?=開頭的子表達式,須要匹配的文本跟在=的後面。例如。基礎
let str = 'a1bMa2bVa3bKa4bG';
let reg = /(a\db)(?=K)/g;
str.match(reg); // ["a3b"]
複製代碼
(a\db)咱們知道是一個子項,匹配的是'a數字b'這樣的規則,而子項後面的那個子項就是正向查找,它限定了子項後面的那個位置必須匹配到'K'。符合這個規則的只有'a3b'。