RegExp 类型
1、正则表达式
var expression = / pattern / flags ;
pattern是正则表达式;
flags是标志,用于标明正则表达式的行为,flags有3个:
g: 全局模式(global),即模式应用于所有字符串,不会找到第一个匹配就停止。
i: 表示不区分大小写(case-insensitive)。
m: 表示多行模式(multiline),即到达一行结尾,还会继续查找下一行。
例:
/*
* 匹配字符串中所有"at"的ํ实例
*/
var pattern1 = /at/g;
/*
* 匹配第一个"bat或cat",不区分大小写
*/
var pattern2 = /[bc]at/i;
/*
*匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi;
模式中的所有 元字符 都必须转义,正则表达式的元字符有:
( [ { \ ^ $ | ) ? * + .]}
2、创建正则表达式的两个方式
(1)字面量的形式定义
var expression = / pattern / flags ;
(2)使用RegExp构造函数
var expression = new RegExp("pattern", "flags");
下面pattern1与pattern2等价:
var pattern1 = /[bc]at/i;
var pattern2 = new RegExp("[bc]at", "i");
注意:构造函数的模式参数是字符串,所以所有元字符都要双重转义,转义过的也如此,例如:\n在字符串中要变为\n。
字面量模式 | 等价的字符串 |
---|---|
/[bc]at/ | “\[bc\]at” |
/.at/ | “\.at” |
/name/age/ | “name\/age” |
/\d.\d{1,2}/ | “\d.\d{1,2}” |
/\w\hello\123/ | “\w\\hello\\123” |
3、RegExp的实例属性
以下属性可以获取有关模式的各种信息
global: 布尔值,表示是否设置了g标志
ignoreCase: 布尔值,表示是否设置了i标志
lastIndex: 整数,表示开始搜索下一个匹配项的字符位置,从0算起。
multiline: 布尔值,表示是否设置了m标志
source: 正则表达式字面量模式转为相应字符串模式
var pattern1 = /\[bc\]at/i;
alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
var pattern2 = new RegExp("\\[bc\\]at", "i");
alert(pattern2.global); //false
alert(pattern2.ignoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"
4、RegExp的实例方法
(1)exec()
exec()方法接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,返回的数组虽然是Array实例,但是包含两个额外的属性:index(表示匹配项在字符串中的位置)、input(表示应用正则表达式的字符串),例:
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby"
alert(matches[0]); // "mom and dad and baby"
alert(matches[1]); // " and dad and baby"
alert(matches[2]); // " and baby"
在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。
(2)test()
test()方法接收一个字符参数,在模式与该参数匹配的情况下返回true,返回false vice adverse
例:
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
(3)toLocaleString()、toLocaleString()
这两个函数都会返回正则表达式的字面量,与创建正则表达式的方式无关。
例:
var pattern = new RegExp("\\[bc\\]at", "gi");
alert(pattern.toString()); // /\[bc\]at/gi
alert(pattern.toLocaleString()); // /\[bc\]at/gi
5、RegExp构造函数属性
使用这些属性可以从exec()或test()执行的操作中提取更具体的信息。
例:
var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)){
alert(RegExp.input); // this has been a short summer
alert(RegExp.leftContext); // this has been a
alert(RegExp.rightContext); // summer
alert(RegExp.lastMatch); // short
alert(RegExp.lastParen); // s
alert(RegExp.multiline); // false
}
例子中的长属性名都可以用相应的短属性名代替:
长属性名 | 短属性名 | 说明 |
---|---|---|
input | $_ | 最近一次要匹配的字符串 |
lastMatch | $& | 最近一次的匹配项 |
lastParen | $+ | 最近一次匹配的捕获组 |
leftContext | $` | input字符串中lastMatch之前的文本 |
multiline | $* | 布尔值,表示是否所有表达式都使用多行文本 |
rightContext | $’ | input字符串中lastMatch之后的文本 |
另外还有9个用于存储铺货组的构造函数属性:RegExp.$1、RegExp.$2……RegExp.$9,分别用于存储第一、第二……第九个匹配的捕获组。
例:
var text = "this has been a short summer";
var pattern = /(..)or(.)/g;
if (pattern.test(text)){
alert(RegExp.$1); //sh
alert(RegExp.$2); //t
}