正則表達(dá)式(Regular Expression)是計算機(jī)科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些符合某個模式的文本。
在 JavaScript中,正則表達(dá)式也是對象。JavaScript通過內(nèi)置對象RegExp支持正則表達(dá)式,有兩種方式創(chuàng)建正則表達(dá)式對象
- 構(gòu)造函數(shù)
new RegExp(pattern [, flags])
- 字面量
const regex = /ab+c/;
元字符
( [ { \ ^ $ | ) ? * + .
預(yù)定義的特殊字符
| 字符 | 正則 | 描述 |
|---|---|---|
| \t | /\t/ | 制表符 |
| \n | /\n/ | 制表符 |
| \r | /\r/ | 回車符 |
| \f | /\f/ | 換頁符 |
| \a | /\a/ | alert字符 |
| \e | /\e/ | escape字符 |
| \cX | /\cX/ | 與X相對應(yīng)的控制字符 |
| \b | /\b/ | 與回退字符 |
| \v | /\v/ | 垂直制表符 |
| \0 | /\0/ | 空字符 |
字符類
一般情況下正則表達(dá)式一個字符(轉(zhuǎn)義字符算一個)對應(yīng)字符串一個字符。但是我們可以使用元字符[]來構(gòu)建一個簡單的類,所謂類是指,符合某些特征的對象,是一個泛指,而不是特指某個字符了,我們可以使用表達(dá)式 [abc] 把字符a或b或c歸為一類,表達(dá)式可以匹配這類的字符。
/[abc]/.test("a") // true
/[abc]/.test("ab") // true
/[abc]/.test("abc") // true
/[abc]/.test("abcd") // true
取反
元字符[]組合可以創(chuàng)建一個類,我們還可以使用元字符^創(chuàng)建反向類/負(fù)向類,反向類的意思是不屬于XXX類的內(nèi)容,表達(dá)式 [^abc] 表示不是字符a或b或c的內(nèi)容,表示匹配不能為括號里面的字符
/[^abc]/.test("a") // false
/[^abc]/.test("ab") // false
/[^abc]/.test("hello") // true
范圍類
按照上面的說明如果希望匹配單個數(shù)字那么表達(dá)式是這樣的
[0123456789]
有時匹配的東西過多,而且類型又相同,全部輸入太麻煩,我們可以用范圍類。特征就是在中間加了個橫線。如[0-9] [a-z] [A-Z]
要是想匹配所有字母呢?在[]組成的類內(nèi)部是可以連寫的,我們還可以這樣寫 [a-zA-Z]
預(yù)定義類
剛才使用正則我們創(chuàng)建了幾個類,來表示數(shù)字,字母等,但這樣寫也很是麻煩,正則表達(dá)式為我們提供了幾個常用的預(yù)定義類來匹配常見的字符
| 字符 | 等價類 | 含義 |
|---|---|---|
| . | [^\r\n] | 除了回車符和換行符之外的所有字符 |
| \d | [0-9] | 數(shù)字字符 |
| \D | [^0-9] | 非數(shù)字字符 |
| \s | [\t\n\x0B\f\r] | 空白符 |
| \S | [^\t\n\x0B\f\r] | 非空白符 |
| \w | [a-zA-Z_0-9] | 單詞字符,字母、數(shù)字下劃線 |
| \W | [^a-zA-Z_0-9] | 非單詞字符 |
/\d/.test("3") //true
/\d/.test("s") // false
/\D/.test("3") // false
/\s/.test(" ") // true
/./.test("哈哈") // true
/\w/.test("正則")
邊界
正則表達(dá)式還提供了幾個常用的邊界匹配字符
| 字符 | 含義 | 描述 |
|---|---|---|
| ^ | 以xxx開頭 | 注意不能緊跟于左中括號的后面 |
| $ | 以xxx結(jié)尾 | |
| \b | 單詞邊界 | 指[a-zA-Z_0-9]之外的字符 |
| \B | 非單詞邊界 |
/c+$/.test('abc') // true
/c+$/.test('abcd') // false
單詞邊界舉例。要匹配的東西的前端或未端不能為英文字母阿拉伯字?jǐn)?shù)字或下橫線。
var str = "12w-eefd&efrew";
str.match(/\b\w+\b/g) // ["12w", "eefd", "efrew"]
量詞
之前我們介紹的方法都是一一匹配的,如果我們希望匹配一個連續(xù)出現(xiàn)很多次數(shù)字的字符串難道我們需要寫成這樣\d\d\d\d...,為此正則表達(dá)式引入了一些量詞
| 字符 | 含義 |
|---|---|
| ? | 出現(xiàn)零次或一次(最多出現(xiàn)一次) |
| + | 出現(xiàn)一次或多次(至少出現(xiàn)一次) |
| * | 出現(xiàn)零次或多次(任意次) |
| {n} | 出現(xiàn)n次 |
| {n,m} | 出現(xiàn)n到m次 |
| {n,} | 至少出現(xiàn)n次 |
/\d{6}/.test("123456") // true
/\d{6}/.test("1234567") // true
/\d{6}/.test("12345") // false
/\d{6,8}/.test("123456789") // true
貪婪模式與非貪婪模式
貪婪模式,量詞在默認(rèn)下是盡可能多的匹配的,以這個表達(dá)式為例:a.*b,它將會匹配最長的以a開始,以b結(jié)束的字符串,如果用它來搜索aabab的話,它會匹配整個字符串a(chǎn)abab。這被稱為貪婪匹配。
'aabab'.match(/a.*b/g) // ["aabab"]
非貪婪模式,讓正則表達(dá)式盡可能少的匹配,也就是說一旦成功匹配不再繼續(xù)嘗試,做法很簡單,在量詞后加上?即可
'aabab'.match(/a.*?b/g) // ["aab","ab"]
分組
到目前為止,我們只能一個字符到匹配,雖然量詞的出現(xiàn),能幫助我們處理一排密緊密相連的同類型字符。但這是不夠的,下面該輪到小括號出場了,中括號表示范圍內(nèi)選擇,大括號表示重復(fù)次數(shù)。小括號允許我們重復(fù)多個字符。
/(cat){3}/.test('catcatcatcat') // true
/(cat){3}/.test('catcat') // false
如果希望匹配cat或dog出現(xiàn)3次該怎么辦呢?可以使用字符|達(dá)到或的功效
/(cat|dog){3}/.test('catcatcatdogdogdog') // true
反向分組
反向引用標(biāo)識由正則表達(dá)式中的匹配組捕獲的子字符串。每個反向引用都由一個編號或名稱來標(biāo)識,并通過“\編號”表示法進(jìn)行引用。
/(dog)\1/.test("dogdog") // true
前瞻
繼續(xù)在分組內(nèi)做文章。前瞻與后瞻其實(shí)都屬于零寬斷言,但javascript不支持后瞻。
| 表達(dá)式 | 含義 |
|---|---|
| exp1(?=exp2) | 匹配后面是exp2的exp1 |
| exp1(?!exp2) | 匹配后面不是exp2的exp1 |
(/hello(?=world)/g).exec('helloworld12333') // ['hello']
(/hello(?=world)/g).exec('hellonextworld') // null
實(shí)例屬性
| 實(shí)例屬性 | 描述 |
|---|---|
| global | 是當(dāng)前表達(dá)式模式首次匹配內(nèi)容的開始位置,從0開始計數(shù)。其初始值為-1,每次成功匹配時,index屬性都會隨之改變。 |
| ignoreCase | 返回創(chuàng)建RegExp對象實(shí)例時指定的ignoreCase標(biāo)志(i)的狀態(tài)。如果創(chuàng)建RegExp對象實(shí)例時設(shè)置了i標(biāo)志,該屬性返回True,否則返回False,默認(rèn)值為False。 |
| lastIndex | 是當(dāng)前表達(dá)式模式首次匹配內(nèi)容中最后一個字符的下一個位置,從0開始計數(shù),常被作為繼續(xù)搜索時的起始位置,初始值為-1, 表示從起始位置開始搜索,每次成功匹配時,lastIndex屬性值都會隨之改變。(只有使用exec()或test()方法才會填入,否則為0) |
| multiLine | 返回創(chuàng)建RegExp對象實(shí)例時指定的multiLine標(biāo)志(m)的狀態(tài)。如果創(chuàng)建RegExp對象實(shí)例時設(shè)置了m標(biāo)志,該屬性返回True,否則返回False,默認(rèn)值為False。 |
| source | 返回創(chuàng)建RegExp對象實(shí)例時指定的表達(dá)式文本字符串。 |