RegExp類型

創(chuàng)建正則表達式

字面量形式

var expression = / pattern / flags;

其中,模式(pattern)部分可以是任何簡單或復(fù)雜的正則表達式,可以包含字符類、限定符、分組、向前查找以及反向引用。每個正則表達式都可帶有一或多個標志(flags),用來標明正則表達式行為。
pattern支持下列3個標志:

  1. g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非發(fā)現(xiàn)第一個匹配項時立即停止;
  2. i:表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項時忽略模式與字符串的大小寫;
  3. 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!");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容