正則表達(dá)式理論篇

首先你要記住它的名字
正則表達(dá)式可以干嘛
數(shù)據(jù)驗(yàn)證。
復(fù)雜的字符串搜尋、替換。
基于模式匹配從字符串中提取子字符串。
概述
構(gòu)造函數(shù)(四種寫法)
var regex = new RegExp('xyz', 'i');
var regex = new RegExp(/xyz/i);
var regex = /xyz/i;
// ES6的寫法。ES5在第一個參數(shù)是正則時,不允許此時使用第二個參數(shù),會報(bào)錯。
// 返回的正則表達(dá)式會忽略原有的正則表達(dá)式的修飾符,只使用新指定的修飾符。
// 下面代碼返回”i”。
new RegExp(/abc/ig, 'i').flags用于模式匹配的String方法
String.search()
參數(shù):要搜索的子字符串,或者一個正則表達(dá)式。
返回:第一個與參數(shù)匹配的子串的起始位置,如果找不到,返回-1。
說明:不支持全局搜索,如果參數(shù)是字符串,會先通過RegExp構(gòu)造函數(shù)轉(zhuǎn)換成正則表達(dá)式。String.replace()
作用:查找并替換字符串。
第一個參數(shù):字符串或正則表達(dá)式,
第二個參數(shù):要進(jìn)行替換的字符串,也可以是函數(shù)。
用法:
$1、$2、...、$99 與 regexp 中的第 1 到第 99 個子表達(dá)式相匹配的文本。
$& 與 regexp 相匹配的子串。
$` 位于匹配子串左側(cè)的文本。
$' 位于匹配子串右側(cè)的文本。
$$ 普通字符$。'abc'.replace(/b/g, "{$$$`$&$'}")
// 結(jié)果為 "a{$abc}c",即把b換成了{(lán)$abc}String.match() 參數(shù):要搜索的子字符串,或者一個正則表達(dá)式。返回:一個由匹配結(jié)果組成的數(shù)組。
String.split() 作用:把一個字符串分割成字符串?dāng)?shù)組。
參數(shù):正則表達(dá)式或字符串。返回:子串組成的數(shù)組。
RegExp的方法
RegExpObject.exec() 參數(shù):字符串。返回:
RegExpObject.test()
參數(shù):字符串。
返回:true或false。RegExpObject.toString()
返回:字符串
字符
限定符(量詞字符)
顯示限定符中,逗號和數(shù)字之間不能有空格,否則返回null!
貪婪量詞
*和+:javascript默認(rèn)是貪婪匹配,也就是說匹配重復(fù)字符是盡可能多地匹配。惰性(最少重復(fù)匹配)量詞
?:當(dāng)進(jìn)行非貪婪匹配,只需要在待匹配的字符后面跟隨一個?即可。
var reg = /a+/;
var reg2 = /a+?/;
var str = 'aaab';
str.match(reg); // ["aaa"]
str.match(reg2); // ["a"]定位點(diǎn)(錨字符、邊界)
標(biāo)記
中括號
[]字符組;標(biāo)記括號表達(dá)式的開始和結(jié)尾,起到的作用是匹配這個或者匹配那個。[...]匹配方括號內(nèi)任意字符。很多字符在[]都會失去本來的意義:[^...]匹配不在方括號內(nèi)的任意字符;[?.]匹配普通的問號和點(diǎn)號。
但是不要濫用字符組這個失去意義的特性,比如不要使用[.]來代替\:轉(zhuǎn)義點(diǎn)號,因?yàn)樾枰冻鎏幚碜址M的代價。大括號
{}標(biāo)記限定符表達(dá)式的開始和結(jié)尾。小括號
()標(biāo)記子表達(dá)式的開始和結(jié)尾,主要作用是分組,對內(nèi)容進(jìn)行區(qū)分。
var str=`<div class="o2">
<div class="o2_team">
<img src="img/logo.jpg" />
</div>
</div>`;
// <(?!img) 表示找一個左尖括號<,而且左尖括號<的后面沒有img字符;
// (?:.|\r|\n)*? 表示匹配左右尖括號<>里面的.或\r或\n,而且匹配次數(shù)為*?;(?:)不保存匹配項(xiàng),提高性能;
// *后面加個? 表示非貪婪匹配。
var reg = /<(?!img)(?:.|\r|\n)*?>/gi;
str.match(reg);
// 返回結(jié)果 ["<div class="o2">", "<div class="o2_team">", "</div>", "</div>"]反向引用:主要作用是給分組加上標(biāo)識符\n。
\n表示引用字符,與第n個子表達(dá)式第一次匹配的字符相匹配。
var reg = /(Mike)(\1)(s)/;
var str = "MikeMikes";
console.log(str.replace(reg,"$1$2'$3"));
// 返回結(jié)果 MikeMike's非打印字符
其他
修飾符
i執(zhí)行不區(qū)分大小寫的匹配。g執(zhí)行一個全局匹配,簡而言之,即找到所有的匹配,而不是在找到第一個之后就停止。m多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結(jié)束和字符串的結(jié)束。
u修飾符
// 加u修飾符以后,ES6就會識別\uD83D\uDC2A為一個字符,返回false。
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // truey修飾符
/b/y.exec('aba') // null
/b/.exec('aba') // ["b"]優(yōu)先級順序:
\轉(zhuǎn)義符(), (?:), (?=), []括號和中括號*、+、?、{n}、{n,}、{n,m}限定符任何元字符
^、$、\定位點(diǎn)和序列|替換
關(guān)于引擎
以貪婪方式進(jìn)行,盡可能匹配更多字符。
急于邀功請賞,所以最左子正則式優(yōu)先匹配成功,因此偶爾會錯過最佳匹配結(jié)果(多選條件分支的情況)。
'nfa not'.match(/nfa|nfa not/)
// 返回["nfa"]回溯(backtracking),導(dǎo)致速度慢。
"AB01CD23CD45CEff".match('AB.*CD')
// 返回 ["AB01CD23CD"]


