ECMAScript通过RegExp类型来支持正则表达式。
JS中有两种方式来定义正则表达式:
1.使用构造函数。语法为:new RegExp(pattern[,flag]),其中第一个参数pattern是以字符串格式表示的正则表达式,第二个参数flag是可选的标识字符串。
//匹配第一个“bat”或“cat”,不区分大小写
var pattern = new RegExp("[bc]at","i");
2.以字面量的形式来定义一个正则表达式。语法格式:var reg = /pattern/[flag];
上面的例子也可以写为:
var pattern = /[bc]at/i
正则表达式的匹配模式支持下列三个标识(flag):
g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。
i:表示不区分大小写模式(case-insensitive),即在确定匹配项时忽略模式和字符串的大小写。
m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配得到项。
这里需要注意的是,在模式中如果要匹配一些元字符,那进行转义。一般需要转义的元字符有:{、(、[、\、^、$、|、?、*、.、+、]、)、}
例如如果如果要匹配[bc]at,那么
字面量的模式可以这么写
var pattern = /\[bc\]at/i
构造函数因为参数字符串得用引号括起来,在某些情况下要对字符进行双重转义,由于在引号中反斜杠本身也需要转义,所以
var pattern = new RegExp("\\[bc\\]at","i");
可以看到第二种写法看着不爽,所以一般就用字面量定义一个正则表达式。
但是要注意,这两种方式定义的正则表达式是不一样的,虽然功能上都是用来匹配字符串,但在ECMAScript3中,正则表达式字面量始终会共享一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新的实例。
JS中正则表达式对象RegExp的实例属性:
1.global:布尔值,表示是否设置了g标识。
ignoreCase:布尔值,表示是否设置了i标识。
multiline:布尔值,表示是否设置了m标识。
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
source:正则表达式的字符串表示,按照字面量形式返回。
RegExp实例方法:
RegExp中常用的方法是test(),它接受一个字符串参数。在模式与改参数匹配的情况下返回true;否则返回false。在只想知道目标字符串与某个模式是否匹配,而不关心目标字符串内容时,用这个方法很方便,它常常出现在if语句中。
<span style="color:#FF0000;"><span style="color:#000000;">var test = "0000-1234567";
var pattern = /\d{4}-\d{7}/;
if(pattern.test(test)){
alert("match");
}</span></span>
RegExp实例的一个方法是exec(),该方法是专门为正则表达式的分组设计的,该方法接收一个要应用模式的字符串作为参数,返回一个包含第一个匹配项信息的数组。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的分组匹配的字符串(如果模式中没有分组,那数组就只包含一项)。例如:
<span style="color:#FF0000;"><span style="color:#000000;">var text = "mom dad baby";
var pattern = /mom( dad( baby)?)?/gi; //注意空格
var matches = pattern.exec(text);
alert(matches.index); //0,index是matches的额外属性,表示匹配项在字符串中位置
alert(matches.input); //input属性表示应用该正则表达式的字符串,这里就是"mom dad baby"
alert(matches[0]); //"mom dad baby"
alert(matches[1]); //" dad baby"
alert(matches[2]); //" baby"</span></span>
复习:
我们知道String类型也定义了几个用于正则匹配的方法。其中一个就是match()方法。在一个字符串上调用该方法本质上与在一个RegExp实例上调用exec()方法是一样。所以上面的在、例子我们也可以这样写:
<span style="color:#FF0000;"><span style="color:#000000;">var text = "mom dad baby";
var pattern = /mom( dad( baby)?)?/gi;
var matches = text.match(pattern);
alert(matches.index); //undefined
alert(matches.input); //undefined
alert(matches[0]); //"mom dad baby"
alert(matches[1]); //undefined
alert(matches[2]); //undefined</span></span>
经过测试,我用的火狐和chrome,并没有得到相同的效果,我也不知道是咋回事,哈哈。RegExp构造函数的属性:
这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。用一个例子来列举说明一下:
var text = "she is a beautiful girl";
var pattern = /(.)eautiful/g;
if(pattern.test(text)){
alert(RegExp.input); //she is a beautiful girl,最近要匹配的一个字符串
alert(RegExp.lastMatch); //beautiful,最近的一个匹配项
alert(RegExp.lastParen); //b,最近一次匹配的捕获组
alert(RegExp.leftContext); //she is a ,input字符串中lastMatch之前的文本
alert(RegExp.multiline); //布尔值,是否设置了多行
alert(RegExp.rightContext); // girl,input字符串中lastMatch之后的文本
}