正則表達(dá)式

正則表達(dá)式(Regular Expression)是計算機(jī)科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些符合某個模式的文本。
在 JavaScript中,正則表達(dá)式也是對象。JavaScript通過內(nèi)置對象RegExp支持正則表達(dá)式,有兩種方式創(chuàng)建正則表達(dá)式對象

  1. 構(gòu)造函數(shù)
new RegExp(pattern [, flags])
  1. 字面量
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á)式文本字符串。

參考

  1. 司徒正美 javascript正則表達(dá)式
  2. MDN 正則表達(dá)式
  3. 饑人谷 課件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容