創(chuàng)建正則表達(dá)式
字面量形式
var expression = / pattern / flags;
其中匹表,模式(pattern)部分可以是任何簡(jiǎn)單或復(fù)雜的正則表達(dá)式门坷,可以包含字符類、限定符袍镀、分組默蚌、向前查找以及反向引用。每個(gè)正則表達(dá)式都可帶有一或多個(gè)標(biāo)志(flags)苇羡,用來標(biāo)明正則表達(dá)式行為绸吸。
pattern支持下列3個(gè)標(biāo)志:
- g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非發(fā)現(xiàn)第一個(gè)匹配項(xiàng)時(shí)立即停止锦茁;
- i:表示不區(qū)分大小寫(case-insensitive)模式攘轩,即在確定匹配項(xiàng)時(shí)忽略模式與字符串的大小寫;
- m:表示多行(multiline)模式码俩,即在到達(dá)一行文本末尾時(shí)還會(huì)繼續(xù)查找下一行中是否存在與模式匹配的項(xiàng)度帮。
例:
/*
* 匹配字符串中所有“at”實(shí)例
*/
var pattern1 = /at/g;
/*
* 匹配第一個(gè)“bat”或者“cat”不區(qū)分大小寫
*/
var pattern2=/[bc]at/i;
/*
*匹配所有以“at”結(jié)尾的3個(gè)字符的組合,不區(qū)分大小寫
*/
var pattern3=/.at/gi;
模式中使用的所有元字符都必須轉(zhuǎn)義稿存。正則表達(dá)式中的元字符有14個(gè)笨篷,包括:
() [] {} \ ^ $ | ? * + .
如果要匹配這些字符,就需要對(duì)他們進(jìn)行轉(zhuǎn)義挠铲,轉(zhuǎn)義用""來進(jìn)行冕屯。
/*
* 匹配第一個(gè)“bat”或者“cat”不區(qū)分大小寫
*/
var pattern1=/[bc]at/i;
/*
* 匹配第一個(gè)“[bc]at”,不區(qū)分大小寫
*/
var pattern2=/\[bc\]at/i;
/*
* 匹配所有以“at”結(jié)尾的3個(gè)字符的組合,不區(qū)分大小寫
*/
var pattern3=/.at/gi;
/*
* 匹配所有“.at”拂苹,不區(qū)分大小寫
*/
var pattern4=/\.at/gi;
量詞
量詞 | 說明 |
---|---|
{n} | 匹配n次 |
{n,m} | 匹配至少n次安聘,最多m次 |
{n,} | 匹配至少n次 |
? | 相當(dāng)于{0,1} |
* | 相當(dāng)于{0,} |
+ | 相當(dāng)于{1,} |
位置符號(hào)
符號(hào) | 說明 |
---|---|
^ | 起始符號(hào) |
$ | 結(jié)束符號(hào) |
?= | 肯定正向環(huán)視 |
?! | 否定正向環(huán)視 |
控制符號(hào)
符號(hào) | 說明 |
---|---|
[] | 候選 |
| | 或 |
^ | 非 |
- | 到 |
例如:
(red|blue|green) 查找任何指定的選項(xiàng)
[abc] 查找方括號(hào)之間的任何字符
[^abc] 查找任何不在方括號(hào)之間的字符
[0-9] 查找任何從0到9的數(shù)字
[a-z] 查找任何從小寫a到小寫z的字符
[A-Z] 查找任何從大寫A到大寫Z的字符
[A-z] 查找任何從大寫A到小寫z的字符
[adgk] 查找給定集合內(nèi)的任何字符
[^adgk] 查找給定集合外的任何字符
$符號(hào)
例 | 說明 |
---|---|
$& | 匹配整個(gè)模式的子字符串(與RegExp.lastMatch的值相同) |
$` | 匹配子字符串之前的子字符串(與RegExp.leftContext的值相同) |
$' | 匹配子字符串之后的子字符串(與RegExp.rightContext的值相同) |
$n | 匹配第n個(gè)捕獲組的子字符串,其中n等于0-9瓢棒。$1表示匹配第一個(gè)捕獲組的子字符串(從第1個(gè)算起) |
$nn | 匹配第nn個(gè)捕獲組的子字符串浴韭,其中nn等于01-99 |
RegExp構(gòu)造函數(shù)形式
RegExp構(gòu)造函數(shù)接收兩個(gè)參數(shù):param1-要匹配的字符串模式,param2-可選的標(biāo)志字符串
/*
* 匹配第一個(gè)“bat”或者“cat”不區(qū)分大小寫
*/
var pattern1=/[bc]at/i;
/*
* 與pattern1相同脯宿,只不過是用構(gòu)造函數(shù)創(chuàng)建的
*/
var pattern2=new RegExp("[bc]at","i");
注意:RegExp構(gòu)造函數(shù)的模式參數(shù)是字符串念颈,所以某些情況下要對(duì)字符串進(jìn)行雙重轉(zhuǎn)義。所有元字符都必須雙重轉(zhuǎn)義连霉,已經(jīng)轉(zhuǎn)義過的字符也一樣榴芳,如\n,\在字符串中被轉(zhuǎn)義為\\跺撼,因此在正則表達(dá)式字符串中會(huì)變成\\\\
RegExp實(shí)例屬性
RegExp的每個(gè)實(shí)例都具有下列屬性窟感,通過這些屬性可以取得有關(guān)模式的各種信息。
- global:布爾值歉井,表示是否設(shè)置了g標(biāo)志
- ignoreCase:布爾值柿祈,表示是否設(shè)置了i標(biāo)志
- lastIndex:整數(shù),表示開始搜索下一個(gè)匹配項(xiàng)的字符位置哩至,從0算起
- multiline:布爾值躏嚎,表示是否設(shè)置了標(biāo)志m
- source:正則表達(dá)式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)中的字符串模式返回
通過實(shí)例屬性可以獲知一個(gè)正則表達(dá)式的各方面信息菩貌,但卻沒多大用處卢佣,因?yàn)檫@些信息都包含在模式聲明中。
var pattern1 = /\[bc\]at/i;
console.log(pattern1.global);//false
console.log(pattern1.ignoreCase);//true
console.log(pattern1.multiline);//false
console.log(pattern1.lastIndex);//0
console.log(pattern1.source);//'\[bc\]at'
var pattern2 = new RegExp('\\[bc\\]at','i');
console.log(pattern2.global);//false
console.log(pattern2.ignoreCase);//true
console.log(pattern2.multiline);//false
console.log(pattern2.lastIndex);//0
console.log(pattern2.source);//'\[bc\]at'
RegExp實(shí)例方法:exec()
專門為捕獲組而設(shè)計(jì)箭阶。
param:接受一個(gè)參數(shù)珠漂,即要應(yīng)用模式的字符串晚缩;
return:返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組;沒有匹配項(xiàng)的情況下返回null媳危。
index | 表示匹配項(xiàng)在字符串的位置 |
---|---|
input | 表示應(yīng)用正則表達(dá)式的字符串。 |
返回的數(shù)組包含兩個(gè)額外的屬性:index和input冈敛。
index | 表示匹配項(xiàng)在字符串的位置 |
---|---|
input | 表示應(yīng)用正則表達(dá)式的字符串待笑。 |
在數(shù)組中,第一項(xiàng)是與整個(gè)模式匹配的字符串抓谴,其他項(xiàng)是與模式中的捕獲組匹配的字符串暮蹂,如果模式中沒有捕獲組,則該數(shù)組只包含一項(xiàng)癌压。
var text = 'mom and dad and baby and others';
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(matches.index); //0
console.log(matches.input); //'mom and dad and baby'
console.log(matches[0]); //'mom and dad and baby'
console.log(matches[1]); //'and dad and baby'
console.log(matches[2]); //'and baby'
上面的例子包含兩個(gè)捕獲組仰泻。最內(nèi)部的捕獲組匹配“and baby”,而包含它的捕獲組匹配“and dad”或者“and dad and baby”滩届。當(dāng)把字符串傳入exec()方法中之后集侯,發(fā)現(xiàn)了一個(gè)匹配項(xiàng)。因?yàn)檎麄€(gè)字符串本身與模式匹配帜消,所以返回的數(shù)組matches的index屬性值為0棠枉。數(shù)組中的第一項(xiàng)是匹配的整個(gè)字符串,第二項(xiàng)包含與第一個(gè)捕獲組匹配的內(nèi)容泡挺,第三項(xiàng)包含與第二個(gè)捕獲組匹配的內(nèi)容辈讶。
對(duì)于exec()方法,即使在模式中設(shè)置了全局標(biāo)志(g)娄猫,它每次也只會(huì)返回一個(gè)匹配項(xiàng)贱除。在不設(shè)置全局標(biāo)志的情況下,在同一個(gè)字符串上多次調(diào)用exec()將始終返回第一個(gè)匹配項(xiàng)的信息媳溺。而在設(shè)置全局標(biāo)志的情況下月幌,每次調(diào)用exec()則都會(huì)在字符串中繼續(xù)查找新匹配項(xiàng),如下例子所示:
var text = "cat,bat,sat,fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text);
matches.index; //0
matches[0]; //cat
pattern1.lastIndex; //0
matches = pattern1.exec(text);
matches.index; //0
matches[0]; //cat
pattern1.lastIndex; //0
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
matches.index; //0
matches[0]; //cat
pattern2.lastIndex; //3
matches = pattern2.exec(text);
matches.index; //5
matches[0]; //bat
pattern2.lastIndex; //8
上面例子中pattern1不是全局模式褂删,因此每次調(diào)用exec()返回的都是第一個(gè)匹配項(xiàng)("cat")飞醉。而pattern2是全局模式,因此每次調(diào)用exec()都會(huì)返回字符串中的下一個(gè)匹配項(xiàng)屯阀,直到搜索到字符串末尾為止缅帘。另外,在全局匹配模式下难衰,lastIndex的值在每次調(diào)用exec()后都會(huì)增加钦无,而非全局匹配模式下則始終保持不變「窍【IE的lastIndex每次也會(huì)變化失暂”顺瑁】
RegExp實(shí)例方法:test()
param:接受一個(gè)參數(shù),即要應(yīng)用模式的字符串弟塞;
return:若模式與該參數(shù)匹配則返回true凭峡,否則返回false。
用于一下情況:只想知道目標(biāo)字符串與某個(gè)模式是否匹配决记,但不需要知道其文本內(nèi)容摧冀。
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
alert("match!");
}