創(chuàng)建正則表達式
字面量形式
var expression = / pattern / flags;
其中,模式(pattern)部分可以是任何簡單或復(fù)雜的正則表達式,可以包含字符類、限定符、分組、向前查找以及反向引用。每個正則表達式都可帶有一或多個標志(flags),用來標明正則表達式行為。
pattern支持下列3個標志:
- g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非發(fā)現(xiàn)第一個匹配項時立即停止;
- i:表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字符串的大小寫;
- m:表示多行(multiline)模式,即在到達一行文本末尾時還會繼續(xù)查找下一行中是否存在與模式匹配的項。
例:
/*
* 匹配字符串中所有“at”實例
*/
var pattern1 = /at/g;
/*
* 匹配第一個“bat”或者“cat”不區(qū)分大小寫
*/
var pattern2=/[bc]at/i;
/*
*匹配所有以“at”結(jié)尾的3個字符的組合,不區(qū)分大小寫
*/
var pattern3=/.at/gi;
模式中使用的所有元字符都必須轉(zhuǎn)義。正則表達式中的元字符有14個,包括:
() [] {} \ ^ $ | ? * + .
如果要匹配這些字符,就需要對他們進行轉(zhuǎn)義,轉(zhuǎn)義用""來進行。
/*
* 匹配第一個“bat”或者“cat”不區(qū)分大小寫
*/
var pattern1=/[bc]at/i;
/*
* 匹配第一個“[bc]at”,不區(qū)分大小寫
*/
var pattern2=/\[bc\]at/i;
/*
* 匹配所有以“at”結(jié)尾的3個字符的組合,不區(qū)分大小寫
*/
var pattern3=/.at/gi;
/*
* 匹配所有“.at”,不區(qū)分大小寫
*/
var pattern4=/\.at/gi;
量詞
| 量詞 | 說明 |
|---|---|
| {n} | 匹配n次 |
| {n,m} | 匹配至少n次,最多m次 |
| {n,} | 匹配至少n次 |
| ? | 相當于{0,1} |
| * | 相當于{0,} |
| + | 相當于{1,} |
位置符號
| 符號 | 說明 |
|---|---|
| ^ | 起始符號 |
| $ | 結(jié)束符號 |
| ?= | 肯定正向環(huán)視 |
| ?! | 否定正向環(huán)視 |
控制符號
| 符號 | 說明 |
|---|---|
| [] | 候選 |
| | | 或 |
| ^ | 非 |
| - | 到 |
例如:
(red|blue|green) 查找任何指定的選項
[abc] 查找方括號之間的任何字符
[^abc] 查找任何不在方括號之間的字符
[0-9] 查找任何從0到9的數(shù)字
[a-z] 查找任何從小寫a到小寫z的字符
[A-Z] 查找任何從大寫A到大寫Z的字符
[A-z] 查找任何從大寫A到小寫z的字符
[adgk] 查找給定集合內(nèi)的任何字符
[^adgk] 查找給定集合外的任何字符
$符號
| 例 | 說明 |
|---|---|
| $& | 匹配整個模式的子字符串(與RegExp.lastMatch的值相同) |
| $` | 匹配子字符串之前的子字符串(與RegExp.leftContext的值相同) |
| $' | 匹配子字符串之后的子字符串(與RegExp.rightContext的值相同) |
| $n | 匹配第n個捕獲組的子字符串,其中n等于0-9。$1表示匹配第一個捕獲組的子字符串(從第1個算起) |
| $nn | 匹配第nn個捕獲組的子字符串,其中nn等于01-99 |
RegExp構(gòu)造函數(shù)形式
RegExp構(gòu)造函數(shù)接收兩個參數(shù):param1-要匹配的字符串模式,param2-可選的標志字符串
/*
* 匹配第一個“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ù)是字符串,所以某些情況下要對字符串進行雙重轉(zhuǎn)義。所有元字符都必須雙重轉(zhuǎn)義,已經(jīng)轉(zhuǎn)義過的字符也一樣,如\n,\在字符串中被轉(zhuǎn)義為\\,因此在正則表達式字符串中會變成\\\\
RegExp實例屬性
RegExp的每個實例都具有下列屬性,通過這些屬性可以取得有關(guān)模式的各種信息。
- global:布爾值,表示是否設(shè)置了g標志
- ignoreCase:布爾值,表示是否設(shè)置了i標志
- lastIndex:整數(shù),表示開始搜索下一個匹配項的字符位置,從0算起
- multiline:布爾值,表示是否設(shè)置了標志m
- source:正則表達式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)中的字符串模式返回
通過實例屬性可以獲知一個正則表達式的各方面信息,但卻沒多大用處,因為這些信息都包含在模式聲明中。
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實例方法:exec()
專門為捕獲組而設(shè)計。
param:接受一個參數(shù),即要應(yīng)用模式的字符串;
return:返回包含第一個匹配項信息的數(shù)組;沒有匹配項的情況下返回null。
| index | 表示匹配項在字符串的位置 |
|---|---|
| input | 表示應(yīng)用正則表達式的字符串。 |
返回的數(shù)組包含兩個額外的屬性:index和input。
| index | 表示匹配項在字符串的位置 |
|---|---|
| input | 表示應(yīng)用正則表達式的字符串。 |
在數(shù)組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串,如果模式中沒有捕獲組,則該數(shù)組只包含一項。
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'
上面的例子包含兩個捕獲組。最內(nèi)部的捕獲組匹配“and baby”,而包含它的捕獲組匹配“and dad”或者“and dad and baby”。當把字符串傳入exec()方法中之后,發(fā)現(xiàn)了一個匹配項。因為整個字符串本身與模式匹配,所以返回的數(shù)組matches的index屬性值為0。數(shù)組中的第一項是匹配的整個字符串,第二項包含與第一個捕獲組匹配的內(nèi)容,第三項包含與第二個捕獲組匹配的內(nèi)容。
對于exec()方法,即使在模式中設(shè)置了全局標志(g),它每次也只會返回一個匹配項。在不設(shè)置全局標志的情況下,在同一個字符串上多次調(diào)用exec()將始終返回第一個匹配項的信息。而在設(shè)置全局標志的情況下,每次調(diào)用exec()則都會在字符串中繼續(xù)查找新匹配項,如下例子所示:
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()返回的都是第一個匹配項("cat")。而pattern2是全局模式,因此每次調(diào)用exec()都會返回字符串中的下一個匹配項,直到搜索到字符串末尾為止。另外,在全局匹配模式下,lastIndex的值在每次調(diào)用exec()后都會增加,而非全局匹配模式下則始終保持不變。【IE的lastIndex每次也會變化?!?/p>
RegExp實例方法:test()
param:接受一個參數(shù),即要應(yīng)用模式的字符串;
return:若模式與該參數(shù)匹配則返回true,否則返回false。
用于一下情況:只想知道目標字符串與某個模式是否匹配,但不需要知道其文本內(nèi)容。
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){
alert("match!");
}