摘要:一正則使用分類正則表達(dá)式后文簡稱為正則可劃分出兩種使用方式通過正則字面量與通過構(gòu)造函數(shù)創(chuàng)建出來的正則對(duì)象,在不考慮訪問正則對(duì)象屬性的情況下,是等價(jià)的。匹配前一個(gè)表達(dá)式次或多次。
正則表達(dá)式在前端開發(fā)中,對(duì)于字符串處理任務(wù)來說,絕對(duì)是一件可以祭出的大殺器。同時(shí)對(duì)于前端開發(fā)人員來說也是一項(xiàng)基本技能,但若只是停留在能看懂,知道去哪查的階段,那距離得心應(yīng)手地運(yùn)用差的可能不止一步兩步。
行業(yè)總習(xí)慣通過工作年限,來粗略估計(jì)一個(gè)工程師的能力與水平,因?yàn)殡S著時(shí)間的延展總覺得會(huì)積累下些許經(jīng)驗(yàn)。但年限這種間接的衡量指標(biāo)太因人而異,太難得到及時(shí)的正反饋。后來慢慢地發(fā)現(xiàn),只有基于自己獨(dú)立地思考,總結(jié)并輸出才會(huì)感到真實(shí)的成長,就像竹子長一段就得生一個(gè)節(jié)。一. 正則使用分類
正則表達(dá)式(后文簡稱為“正則”)可劃分出兩種使用方式:
通過正則字面量與通過RegExp構(gòu)造函數(shù)創(chuàng)建出來的正則對(duì)象,在不考慮訪問正則對(duì)象屬性的情況下,是等價(jià)的。如果需訪問正則對(duì)象的屬性,需通過RegExp初始化正則實(shí)例。
正則表達(dá)式字面量 /正則匹配模式/[修飾符]
字符串對(duì)象內(nèi)置了一些與使用正則表達(dá)式相關(guān)的方法,這些方法的入?yún)⒕褪撬璧?em>正則表達(dá)式字面量
match : 返回一個(gè)數(shù)組或者在未匹配到時(shí)返回null
search : 返回匹配到的位置索引,或者在失敗時(shí)返回-1
replace : 使用替換字符串替換掉匹配到的子字符串
split : 一個(gè)使用正則表達(dá)式或者一個(gè)固定字符串分隔一個(gè)字符串,并將分隔后的子字符串存儲(chǔ)到數(shù)組中
RegExp構(gòu)造的正則表達(dá)式對(duì)象 new RegExp("正則匹配模式"[, 修飾符])
通過正則構(gòu)造函數(shù)實(shí)例化的正則對(duì)象,同樣也具有類似的方法
exec : 返回一個(gè)數(shù)組或者在未匹配到時(shí)返回null
test : 匹配到返回true否則false
二. 正則的使用(持續(xù)更新)
當(dāng)匹配到時(shí),exec和match返回結(jié)果的不同
字符串的match方法,當(dāng)正則表達(dá)式按照字面量傳參時(shí),返回匹配到字符串的數(shù)組
// 字符串的match方法 var str = "cdbbdbsbz" var ret1 = str.match(/d(b+)d/g) console.log(ret1) // ["dbbd"]
當(dāng)傳參為正則對(duì)象時(shí),返回值與exec方法相同。
正則對(duì)象的exec方法,返回從索引值處開始首次匹配到結(jié)果的字符串?dāng)?shù)組,數(shù)組的第一個(gè)元素為結(jié)果字符串,若匹配模式中存在括號(hào),則括號(hào)中的子模式在本次匹配中得到的字符串,依次排列在結(jié)果數(shù)組中。與此同時(shí),該數(shù)組對(duì)象還附帶了一些相關(guān)的屬性。
// 正則對(duì)象的exec方法 var regExp = new RegExp(/d(b+)d/, "g") var ret2 = regExp.exec(str) console.log(ret2) // ["dbbd", "bb", index: 1, input: "cdbbdbsbz", groups: undefined]
對(duì)象 | 屬性 | 描述 | 例子中對(duì)應(yīng)的值 |
---|---|---|---|
retArray | 匹配到的字符串,和所有被記住的字符串 | ["dbbd", "bb"] | |
index | 本次匹配結(jié)果,開始的索引值 | 1 | |
input | 初始字符串 | "cdbbdbsbz" | |
[0] | 本次匹配到的字符串 | "dbbd" | |
regExp | lastIndex | 下一個(gè)匹配的索引值 | 5 |
source | 匹配模式的文本 | "d(b+)d" |
使用括號(hào)的子字符串匹配(組匹配)
拿上例的匹配模式來看/d(b+)d/g,括號(hào)中匹配到的子字符串,會(huì)被記錄在數(shù)組元素[1],...,[n]中,且保存數(shù)量可以是無限的。除了通過js直接使用外,還可以這樣使用:
var name = "John Tom" var newName = name.replace(/(w+)s(w+)/, "$2 $1") console.log(newName) // Tom John
正則表達(dá)式修飾符
g:全局搜索
i:不區(qū)分大小寫搜索
m:多行搜索,^和$匹配的開始或結(jié)束輸入字符串中的每一行,而非整個(gè)輸入字符串
u:開啟Unicode模式,用來正確處理大于uFFFF的字符
y:粘連匹配,類似全局搜索,但不同是其要求在lastIndex的位置發(fā)現(xiàn)匹配,而g是從lastIndex處開始搜索,也就是說粘連匹配y模式中隱藏了頭部匹配的標(biāo)志^。
具名組匹配
上面有討論過組匹配的概念和用法,通過數(shù)組下標(biāo)的方式使用總會(huì)帶來些許不便,所以在ES2018中引入了具名組匹配,允許為每一個(gè)組匹配指定一個(gè)名字,以方便閱讀和調(diào)用,來看例子:
// 之前的組匹配 const RE_DATE = /(d{4})-(d{2})-(d{2})/; const matchObj = RE_DATE.exec("1999-12-31"); const year = matchObj[1]; // 1999 const month = matchObj[2]; // 12 const day = matchObj[3]; // 31 // 使用具名組匹配 const RE_DATE = /(?三. 正則匹配模式d{4})-(? d{2})-(? d{2})/; const matchObj = RE_DATE.exec("1999-12-31"); const year = matchObj.groups.year; // 1999 const month = matchObj.groups.month; // 12 const day = matchObj.groups.day; // 31
下表列出了在正則表達(dá)式中,可以利用的特殊字符的完整列表和描述
字符 | 含義 |
---|---|
/ | 1. 在非特殊字符前,表示特殊用途; 2. 在特殊字符前,轉(zhuǎn)義為字面量;3. 在new RegExp("pattern") 中需將 進(jìn)行轉(zhuǎn)義。 |
^ | 匹配輸入的開始。若設(shè)置多行匹配,則也匹配換行符后緊跟的位置 |
$ | 匹配輸入的結(jié)束。若設(shè)置多行匹配,則也匹配換行符前的位置。 |
* | 匹配前一個(gè)表達(dá)式0次或多次。等價(jià)于 {0,} |
+ | 匹配前面一個(gè)表達(dá)式1次或者多次。等價(jià)于 {1,} |
? | 1. 匹配前面一個(gè)表達(dá)式0次或者1次。等價(jià)于 {0,1};2. 如果緊跟在任何量詞 *、 +、? 或 {} 的后面,將會(huì)使量詞變?yōu)榉秦澙返模ㄆヅ浔M量少的字符),和缺省使用的貪婪模式(匹配盡可能多的字符)正好相反。 |
. | 匹配除換行符之外的任何單個(gè)字符 |
(x) | 匹配 x 并且記住匹配項(xiàng) |
(?:x) | 匹配 x 但是不記住匹配項(xiàng)(非捕獲括號(hào)) |
x(?=y) | 匹配 x 僅僅當(dāng)x后面跟著y (正向肯定查找) |
x(?!y) | 匹配 x 僅僅當(dāng)x后面不跟著y(正向否定查找) |
{n} | 匹配了前面一個(gè)字符剛好發(fā)生了n次(n為正整數(shù)) |
{n,m} | 匹配前面的字符至少n次,最多m次 |
[xyz] | 表示字符集合,匹配方括號(hào)的中任意字符 |
[^xyz] | 表示一個(gè)反向字符集,匹配沒在方括號(hào)的中任意字符 |
[] | 匹配一個(gè)退格(U+0008) |
匹配一個(gè)詞的邊界 | |
B | 匹配一個(gè)非單詞邊界 |
cX | 當(dāng)X是處于A到Z之間的字符的時(shí)候,匹配字符串中的一個(gè)控制符 |
d | 匹配一個(gè)數(shù)字,等價(jià)于[0-9] |
D | 匹配一個(gè)非數(shù)字字符,等價(jià)于[^0-9] |
f | 匹配一個(gè)換頁符 |
匹配一個(gè)換行符 | |
匹配一個(gè)回車符 | |
s | 匹配一個(gè)空白字符,包括空格、制表符、換頁符和換行符 |
S | 匹配一個(gè)非空白字符 |
匹配一個(gè)水平制表符 | |
v | 匹配一個(gè)垂直制表符 |
w | 匹配一個(gè)單字字符(字母、數(shù)字或者下劃線) |
W | 匹配一個(gè)非單字字符 |
它返回最后的第n個(gè)子捕獲匹配的子字符串(捕獲的數(shù)目以左括號(hào)計(jì)數(shù)) | |