文章內(nèi)容摘自阮一峰大大—RegExp對(duì)象,總結(jié)一下方便自己記憶:
1.正則匹配規(guī)則
-
字面量字符串
/dog/ 匹配 ‘dog’
-
元字符:
點(diǎn)字符(.) 匹配 除回車(\r)、換行(\n) 丘喻、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
位置字符(^ / $) ^/$ 表示字符串開(kāi)始/結(jié)束的位置
選擇符(|) 表示或關(guān)系仅颇,即cat|dog表示匹配cat或dog受神。選擇符會(huì)包括它前后的多個(gè)字符,比如/ab|cd/指的是匹配ab或者cd愿卒,而不是指匹配b或者c缚去。如果想修改這個(gè)行為,可以使用圓括號(hào)琼开,即/a(b|c)d/ -
轉(zhuǎn)義字符
正則表達(dá)式中那些有特殊含義的字符易结,如果要匹配它們本身,就需要在它們前面要加上反斜杠柜候。比如要匹配加號(hào)搞动,就要寫(xiě)成+。
正則模式中渣刷,需要用斜杠轉(zhuǎn)義的鹦肿,一共有12個(gè)字符:^、.辅柴、[箩溃、$瞭吃、(、)涣旨、|歪架、*、+霹陡、?和蚪、{和\。需要特別注意的是烹棉,如果使用RegExp方法生成正則對(duì)象攒霹,轉(zhuǎn)義需要使用兩個(gè)斜杠,因?yàn)樽址畠?nèi)部會(huì)先轉(zhuǎn)義一次浆洗。
-
特殊字符
\cX 表示Ctrl-[X]催束,其中的X是A-Z之中任一個(gè)英文字母,用來(lái)匹配控制字符辅髓。
[\b] 匹配退格鍵(U+0008)泣崩,不要與\b混淆。
\n 匹配換行鍵洛口。
\r 匹配回車鍵矫付。
\t 匹配制表符tab(U+0009)。
\v 匹配垂直制表符(U+000B)第焰。
\f 匹配換頁(yè)符(U+000C)买优。
\0 匹配null字符(U+0000)。
\xhh 匹配一個(gè)以兩位十六進(jìn)制數(shù)(\x00-\xFF)表示的字符挺举。
\uhhhh 匹配一個(gè)以四位十六進(jìn)制數(shù)(\u0000-\uFFFF)表示的unicode字符杀赢。
-
字符類
字符類(class)表示有一系列字符可供選擇,只要匹配其中一個(gè)就可以了湘纵。所有可供選擇的字符都放在方括號(hào)內(nèi)脂崔,比如[xyz] 表示x、y梧喷、z之中任選一個(gè)匹配砌左。
(1).脫字符(^)
如果方括號(hào)內(nèi)的第一個(gè)字符是[^],則表示除了字符類之中的字符铺敌,其他字符都可以匹配汇歹。比如,[^xyz]表示除了x偿凭、y产弹、z之外都可以匹配。
如果方括號(hào)內(nèi)沒(méi)有其他字符弯囊,即只有[^]痰哨,就表示匹配一切字符胶果,其中包括換行符,而點(diǎn)號(hào)(.)是不包括換行符的
(2).連字符(-)
某些情況下斤斧,對(duì)于連續(xù)序列的字符稽物,連字符(-)用來(lái)提供簡(jiǎn)寫(xiě)形式,表示字符的連續(xù)范圍折欠。比如,[abc]可以寫(xiě)成[a-c]吼过,[0123456789]可以寫(xiě)成[0-9]锐秦,同理[A-Z]表示26個(gè)大寫(xiě)字母。注意:[1-31]盗忱,不代表1到31酱床,只代表1到3。
-
預(yù)定義模式
\d 匹配0-9之間的任一數(shù)字趟佃,相當(dāng)于[0-9]扇谣。
\D 匹配所有0-9以外的字符,相當(dāng)于[^0-9]闲昭。
\w 匹配任意的字母罐寨、數(shù)字和下劃線,相當(dāng)于[A-Za-z0-9_]序矩。
\W 除所有字母鸯绿、數(shù)字和下劃線以外的字符,相當(dāng)于[^A-Za-z0-9_]簸淀。
\s 匹配空格(包括制表符瓶蝴、空格符、斷行符等)租幕,相等于[\t\r\n\v\f]舷手。
\S 匹配非空格的字符,相當(dāng)于[^\t\r\n\v\f]劲绪。
\b 匹配詞的邊界男窟。
\B 匹配非詞邊界,即在詞的內(nèi)部珠叔。
-
重復(fù)類
模式的精確匹配次數(shù)蝎宇,使用大括號(hào)({})表示。{n}表示恰好重復(fù)n次祷安,{n,}表示至少重復(fù)n次姥芥,{n,m}表示重復(fù)不少于n次,不多于m次汇鞭。
-
量詞類
? 問(wèn)號(hào)表示某個(gè)模式出現(xiàn)0次或1次凉唐,等同于{0, 1}庸追。
* 星號(hào)表示某個(gè)模式出現(xiàn)0次或多次,等同于{0,}台囱。
+ 加號(hào)表示某個(gè)模式出現(xiàn)1次或多次淡溯,等同于{1,}。
-
貪婪模式
默認(rèn)情況下是最大可能匹配簿训,即匹配直到下一個(gè)字符不滿足匹配規(guī)則為止咱娶。這被稱為貪婪模式。
如果想將貪婪模式改為非貪婪模式强品,可以在量詞符后面加一個(gè)問(wèn)號(hào)膘侮。
//貪婪模式
var s = 'aaa';
s.match(/a+/) // ["aaa"]
//非貪婪模式
var s = 'aaa';
s.match(/a+?/) // ["a"]
*?:表示某個(gè)模式出現(xiàn)0次或多次,匹配時(shí)采用非貪婪模式的榛。
+?:表示某個(gè)模式出現(xiàn)1次或多次琼了,匹配時(shí)采用非貪婪模式。
-
修飾符
修飾符(modifier)表示模式的附加規(guī)則夫晌,放在正則模式的最尾部雕薪。
修飾符可以單個(gè)使用,也可以多個(gè)一起使用晓淀。
- g修飾符
默認(rèn)情況下所袁,第一次匹配成功后,正則對(duì)象就停止向下匹配了凶掰。g修飾符表示全局匹配(global)纲熏,加上它以后,正則對(duì)象將匹配全部符合條件的結(jié)果锄俄,主要用于搜索和替換局劲。- i修飾符
默認(rèn)情況下,正則對(duì)象區(qū)分字母的大小寫(xiě)奶赠,加上i修飾符以后表示忽略大小寫(xiě)(ignorecase)鱼填。- m修飾符
m修飾符表示多行模式(multiline),會(huì)修改^和$的行為毅戈。默認(rèn)情況下(即不加m修飾符時(shí))苹丸,^和$匹配字符串的開(kāi)始處和結(jié)尾處,加上m修飾符以后苇经,^和$還會(huì)匹配行首和行尾赘理,即^和$會(huì)識(shí)別換行符(\n)。
-
組匹配
正則表達(dá)式的括號(hào)表示分組匹配扇单,括號(hào)中的模式可以用來(lái)匹配分組的內(nèi)容商模。
var m = 'abcabc'.match(/(.)b(.)/);
m
// ['abc', 'a', 'c']
上面代碼中,正則表達(dá)式/(.)b(.)/一共使用兩個(gè)括號(hào),第一個(gè)括號(hào)捕獲a施流,第二個(gè)括號(hào)捕獲c响疚。
注意:使用組匹配時(shí),不宜同時(shí)使用g修飾符瞪醋,否則match方法不會(huì)捕獲分組的內(nèi)容忿晕。
var m = 'abcabc'.match(/(.)b(.)/g);
m
// ['abc', 'abc']
在正則表達(dá)式內(nèi)部,可以用\n引用括號(hào)匹配的內(nèi)容银受,n是從1開(kāi)始的自然數(shù)践盼,表示對(duì)應(yīng)順序的括號(hào)。
/(.)b(.)\1b\2/.test("abcabc") // true
/y(..)(.)\2\1/.test('yabccab') // true
上面的第一行代碼中宾巍,\1表示前一個(gè)括號(hào)匹配的內(nèi)容(即“a”)宏侍,\2表示第二個(gè)括號(hào)匹配的內(nèi)容(即“b”)。
/y((..)\2)\1/.test('yabababab') // true
括號(hào)還可以嵌套蜀漆,此時(shí)\1指向外層括號(hào),\2指向內(nèi)層括號(hào)咱旱。
非捕獲組:
(?:x)稱為非捕獲組(Non-capturing group)确丢,表示不返回該組匹配的內(nèi)容,即匹配的結(jié)果中不計(jì)入這個(gè)括號(hào)吐限。
var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]
上面代碼中的模式鲜侥,一共使用了兩個(gè)括號(hào)。其中第一個(gè)括號(hào)是非捕獲組诸典,所以最后返回的結(jié)果中沒(méi)有第一個(gè)括號(hào)描函,只有第二個(gè)括號(hào)匹配的內(nèi)容。
先行斷言:
x(?=y)稱為先行斷言(Positive look-ahead)狐粱,x只有在y前面才匹配舀寓,y不會(huì)被計(jì)入返回結(jié)果。比如肌蜻,要匹配后面跟著百分號(hào)的數(shù)字互墓,可以寫(xiě)成/\d+(?=%)/。
var m = 'abc'.match(/b(?=c)/);
m // ["b"]
先行否定斷言:
x(?!y)稱為先行否定斷言(Negative look-ahead)蒋搜,x只有不在y前面才匹配篡撵,y不會(huì)被計(jì)入返回結(jié)果。比如豆挽,要匹配后面跟的不是百分號(hào)的數(shù)字育谬,就要寫(xiě)成/\d+(?!%)/。
/\d+(?!\.)/.exec('3.14')
// ["14"]
2.正則表達(dá)式
新建正則表達(dá)式有兩種方法帮哈。
一種是使用字面量膛檀,以斜杠表示開(kāi)始和結(jié)束。
另一種是使用 RegExp 構(gòu)造函數(shù)。
var regex = /xyz/;
var regex = new RegExp('xyz');
上面兩種寫(xiě)法是等價(jià)的宿刮,都新建了一個(gè)內(nèi)容為xyz的正則表達(dá)式對(duì)象互站。它們的主要區(qū)別是,第一種方法在編譯時(shí)新建正則表達(dá)式僵缺,第二種方法在運(yùn)行時(shí)新建正則表達(dá)式胡桃。
正則對(duì)象生成以后,有兩種使用方式:
正則對(duì)象的方法:將字符串作為參數(shù)磕潮,比如regex.test(string)翠胰。
字符串對(duì)象的方法:將正則對(duì)象作為參數(shù),比如string.match(regex)自脯。
-
正則對(duì)象的屬性
屬性分兩類
一類是修飾符相關(guān)之景,返回一個(gè)布爾值,表示對(duì)應(yīng)的修飾符是否設(shè)置膏潮。
ignoreCase:返回一個(gè)布爾值锻狗,表示是否設(shè)置了i修飾符,該屬性只讀焕参。
global:返回一個(gè)布爾值轻纪,表示是否設(shè)置了g修飾符,該屬性只讀叠纷。
multiline:返回一個(gè)布爾值刻帚,表示是否設(shè)置了m修飾符,該屬性只讀涩嚣。
一類與修飾符無(wú)關(guān)的屬性崇众,主要是下面兩個(gè)。
lastIndex:返回下一次開(kāi)始搜索的位置航厚。該屬性可讀寫(xiě)顷歌,但是只在設(shè)置了g修飾符時(shí)有意義。
source:返回正則表達(dá)式的字符串形式(不包括反斜杠)幔睬,該屬性只讀衙吩。
-
正則對(duì)象的方法
(1)test
正則對(duì)象的test方法返回一個(gè)布爾值,表示當(dāng)前模式是否能匹配參數(shù)字符
串溪窒。
/cat/.test('cats and dogs') // true
如果正則表達(dá)式帶有g(shù)修飾符坤塞,則每一次test方法都從上一次結(jié)束的位置開(kāi)始向后匹配,還可以通過(guò)正則對(duì)象的lastIndex屬性指定開(kāi)始搜索的位置。
lastIndex屬性只對(duì)同一個(gè)正則表達(dá)式有效
var count = 0;
while (/a/g.test('babaa')) count++;
上面代碼會(huì)導(dǎo)致無(wú)限循環(huán)澈蚌,因?yàn)閣hile循環(huán)的每次匹配條件都是一個(gè)新的正則表達(dá)式摹芙,導(dǎo)致lastIndex屬性總是等于0。
new RegExp('').test('abc')
// true
如果正則模式是一個(gè)空字符串宛瞄,則匹配所有字符串浮禾。
-
exec()
正則對(duì)象的exec方法交胚,可以返回匹配結(jié)果。如果發(fā)現(xiàn)匹配盈电,就返回一個(gè)數(shù)組蝴簇,成員是每一個(gè)匹配成功的子字符串,否則返回null匆帚。
var s = '_x_x';
var r1 = /x/;
var r2 = /y/;
r1.exec(s) // ["x"]
r2.exec(s) // null
如果正則表示式包含圓括號(hào)(即含有“組匹配”)熬词,則返回的數(shù)組會(huì)包括多個(gè)成員。第一個(gè)成員是整個(gè)匹配成功的結(jié)果吸重,后面的成員就是圓括號(hào)對(duì)應(yīng)的匹配成功的組互拾。也就是說(shuō),第二個(gè)成員對(duì)應(yīng)第一個(gè)括號(hào)嚎幸,第三個(gè)成員對(duì)應(yīng)第二個(gè)括號(hào)颜矿,以此類推。整個(gè)數(shù)組的length屬性等于組匹配的數(shù)量再加1嫉晶。
exec方法的返回?cái)?shù)組還包含以下兩個(gè)屬性:
input:整個(gè)原字符串骑疆。
index:整個(gè)模式匹配成功的開(kāi)始位置(從0開(kāi)始計(jì)數(shù))。
如果正則表達(dá)式加上g修飾符替废,則可以使用多次exec方法箍铭,下一次搜索的位置從上一次匹配成功結(jié)束的位置開(kāi)始。
var r = /a(b+)a/g;
var a1 = r.exec('_abbba_aba_');
a1 // ['abbba', 'bbb']
a1.index // 1
r.lastIndex // 6
var a2 = r.exec('_abbba_aba_');
a2 // ['aba', 'b']
a2.index // 7
r.lastIndex // 10
var a3 = r.exec('_abbba_aba_');
a3 // null
a3.index // TypeError: Cannot read property 'index' of null
r.lastIndex // 0
var a4 = r.exec('_abbba_aba_');
a4 // ['abbba', 'bbb']
a4.index // 1
r.lastIndex // 6
當(dāng)?shù)谌纹ヅ浣Y(jié)束以后舶担,整個(gè)字符串已經(jīng)到達(dá)尾部,正則對(duì)象的lastIndex屬性重置為0彬呻,意味著第四次匹配將從頭開(kāi)始衣陶。
利用g修飾符允許多次匹配的特點(diǎn),可以用一個(gè)循環(huán)完成全部匹配闸氮。
var r = /a(b+)a/g;
var s = '_abbba_aba_';
while(true) {
var match = r.exec(s);
if (!match) break;
console.log(match[1]);
}
// bbb
// b
如果正則對(duì)象是一個(gè)空字符串剪况,則exec方法會(huì)匹配成功,但返回的也是空字符串蒲跨。
3.字符串對(duì)象的方法
match():返回一個(gè)數(shù)組译断,成員是所有匹配的子字符串。
search():按照給定的正則表達(dá)式進(jìn)行搜索或悲,返回一個(gè)整數(shù)孙咪,表示匹配開(kāi)始的位置。
replace():按照給定的正則表達(dá)式進(jìn)行替換巡语,返回替換后的字符串翎蹈。
split():按照給定規(guī)則進(jìn)行字符串分割,返回一個(gè)數(shù)組男公,包含分割后的各個(gè)成員荤堪。
-
String.prototype.match()
字符串的match方法與正則對(duì)象的exec方法非常類似:匹配成功返回一個(gè)數(shù)組,匹配失敗返回null。
如果正則表達(dá)式帶有g(shù)修飾符澄阳,則該方法與正則對(duì)象的exec方法行為不同拥知,會(huì)一次性返回所有匹配成功的結(jié)果。
設(shè)置正則表達(dá)式的lastIndex屬性碎赢,對(duì)match方法無(wú)效低剔,匹配總是從字符串的第一個(gè)字符開(kāi)始。
-
String.prototype.search()
字符串對(duì)象的search方法揩抡,返回第一個(gè)滿足條件的匹配結(jié)果在整個(gè)字符串中的位置户侥。如果沒(méi)有任何匹配,則返回-1峦嗤。
正則表達(dá)式使用g修飾符之后蕊唐,使用lastIndex屬性指定開(kāi)始匹配的位置,結(jié)果無(wú)效烁设,還是從字符串的第一個(gè)字符開(kāi)始匹配替梨。
-
String.prototype.replace()
字符串對(duì)象的replace方法可以替換匹配的值。它接受兩個(gè)參數(shù)装黑,第一個(gè)是搜索模式副瀑,第二個(gè)是替換的內(nèi)容。
搜索模式如果不加g修飾符恋谭,就替換第一個(gè)匹配成功的值糠睡,否則替換所有匹配成功的值。
replace方法的一個(gè)應(yīng)用疚颊,就是消除字符串首尾兩端的空格狈孔。
var str = ' #id div.class ';
str.replace(/^\s+|\s+$/g, '')
// "#id div.class"
replace方法的第二個(gè)參數(shù)可以使用美元符號(hào)$,用來(lái)指代所替換的內(nèi)容材义。
$& 指代匹配的子字符串均抽。
$` 指代匹配結(jié)果前面的文本。
$' 指代匹配結(jié)果后面的文本其掂。
$n 指代匹配成功的第n組內(nèi)容油挥,n是從1開(kāi)始的自然數(shù)。
$$ 指代美元符號(hào)$款熬。
replace方法的第二個(gè)參數(shù)還可以是一個(gè)函數(shù)深寥,將每一個(gè)匹配內(nèi)容替換為函數(shù)返回值。
作為replace方法第二個(gè)參數(shù)的替換函數(shù)贤牛,可以接受多個(gè)參數(shù)翩迈。第一個(gè)參數(shù)是捕捉到的內(nèi)容,第二個(gè)參數(shù)是捕捉到的組匹配(有多少個(gè)組匹配盔夜,就有多少個(gè)對(duì)應(yīng)的參數(shù))负饲。此外堤魁,最后還可以添加兩個(gè)參數(shù),倒數(shù)第二個(gè)參數(shù)是捕捉到的內(nèi)容在整個(gè)字符串中的位置(比如從第五個(gè)位置開(kāi)始)返十,最后一個(gè)參數(shù)是原字符串妥泉。
-
String.prototype.split()
字符串對(duì)象的split方法按照正則規(guī)則分割字符串,返回一個(gè)由分割后的各個(gè)部分組成的數(shù)組洞坑。
該方法接受兩個(gè)參數(shù)盲链,第一個(gè)參數(shù)是分隔規(guī)則,第二個(gè)參數(shù)是返回?cái)?shù)組的最大成員數(shù)迟杂。