ECMAScript通过RegExp类型在支持正则表达式
一、var expression = / pattern/ flags;
一个正则表达式包括两个部分:一个是模式,就是任何简单或者复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。另一个是标志,其中标志有三种:
1、g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
2、i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
3、m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项;
因此,一个正则表达式就是一个模式与上述3个标志的组合体。
- 与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:
(,[,{,,^,$,|,),?,*,+,.,],} 例如:
/*
*匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
*匹配第一个[bc]at,不区分大小写
*/
var pattern2 = /\[bc\]at/i;
- 另一种创建正则表达式的方式是使用RegExp的构造函数
** var pattern2 = new RegExp("[bc]at","i");**
二、RegExp实例属性
- global:布尔值,表示是否设置了g标志。
- ignoreCase:布尔值,表示是否设置了i标志。
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
- multiline:布尔值,表示是否设置了m标志。
- source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
三、RegExp实例方法
** 1、exec()方法**
接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组。返回的数组包含两个额外的属性:index和input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。例子:
var text = "mom and dad and baby";
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"
- 其中需要注意的是对于exec()而言,即使在模式中设置了全局模式,它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项,如下面的例子所示:
var text1 = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches1 = pattern1.exec(text1);
console.log(matches1.index);// 0
console.log(pattern1.lastIndex);// 0
console.log(matches1[0]);// cat
matches1 = pattern1.exec(text1);
console.log(matches1.index); // 0
console.log(pattern1.lastIndex);// 0
console.log(matches1[0]);// cat
var pattern2 = /.at/g;
var matches2 = pattern2.exec(text1);
console.log(matches2.index); //0
console.log(pattern2.lastIndex);// 3
console.log(matches2[0]);// cat
matches2 = pattern2.exec(text1);
console.log(matches2.index);// 5
console.log(pattern2.lastIndex);// 8
console.log(matches2[0]);// bat
2、test()方法
接受一个字符串参数,匹配就返回true,不匹配就返回false
四、RegExp构造函数属性
var text = "this has been a short summer";
var pattern = /(.)hort/g;
/*
*注意:Opera不支持input,lastMatch,lastParen和multiline属性
*IE不支持multiline属性
*/
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属性返回了原始字符串;
- leftContext属性返回了单词short之前的字符串,而rightContext属性则返回了short之后的字符串;
- lastMatch属性返回最近一次与整个正则表达式匹配的字符串,即short;
- lastParen属性返回最近一次匹配的捕获组,即例子中的s;
五、模式的局限性
- 匹配字符串开始和结尾的\A和\Z
- 向后查找
- 并集和交集类
- 原子组
- Unicode支持
- 命名的捕获组
- s (single,单行)和 x(free-spacing,无间隔)匹配模式
- 条件匹配
- 正则表达式注释