RegExp对象即正则表达式对象,JS中的正则表达式对象可以有两种方式表示:字面量方式和构造函数方式。
var reg = /name/ig; // 字面量的表达方式
var reg = new RegEXp("name", "ig"); // 构造函数表达方式
上诉两种方式是完全等价的,对于第一种方式,需要用两个/将匹配模式放入其中,后面的ig是标志符;第二种方式不需要使用/,直接将匹配模式的字符串作为第一个参数,标志符的字符串作为第二个参数。
在ECMAScrip中定义了三种标志符:
1. i 表示区分大小写,即大小写敏感,不使用i标志符即忽略大小写;
2. g 表示进行全局匹配,当匹配第一次成功后,会继续向后匹配下一个满足的字符串直到末尾;
3. m 表示进行多行匹配的模式,即到了每一行末尾都会继续跳到下一行继续匹配;
模式中如果要匹配元字符(包括:( ) [ ] { } \ ^ $ | . * ? + ),同样需要使用\进行转义。比如像匹配 . 这个元字符,那么字面量表达方式是就是 var reg = /\.s/ig; 如果使用构造函数方式就是 var reg = new RegExp("\\.s", "ig"); ,当用字符串表示正则表达式的时候,需要进行双重转义,即字面量中的一个\在用字符串表示的时候就变成两个\\。
继续来看正则表达式对象的主要属性,当我们创建一个RegExp对象后,这个对象就具有一下属性:
1. global 标识是否设置了g标志符;
2. ignoreCase 标识是否设置了i标志符;
3. multiline 标识是否设置了m标志符;
4. lastIndex 表示开始搜索下一次匹配项的起始位置,初始值为0;
5. source 用于匹配的模式;
除了属性,还有两个很有用的方法;
1. test:传入一个字符串作为参数,正则表达式匹配成功就返回true,否则返回false。我们不用关心匹配的具体情况,只需要知道字符串中是否存在匹配的时候,使用这个方法;
2. exec:这个方法的功能要复杂一些,同样是传入一个我们需要搜索的字符串作为参数。如果没有匹配成功就返回null,如果成功了就返回一个数组对象,数组对象的第一项表示与整个模式匹配的字符串,如果匹配模式中存在捕获分组,那么从第二项开始就依次填入捕获分组的项。除了数组项,这个数组对象还包括index和input属性,index表示匹配的字符串在整个字符串中的位置,input则表示整个字符串。如果匹配模式设置了全局标志符,那么再次执行exec方法,会继续从上次匹配结束的地方,即lastIndex标识的位置开始继续搜索匹配的字符串,直到匹配失败之后,lastIndex就被重置为0。
例子:
var str = "is as cs";
var reg = /((.)s)/ig;
console.log( reg.global ); // true
console.log( reg.ignoreCase ); // true
console.log( reg.multiline ); // false
console.log( reg.lastIndex ); // 0
console.log( reg.source ); // .s
do {
var m = reg.exec( s );
if ( m ) {
console.log( m ); // 保存匹配成功的数组项,包括捕获分组,["is", "is", "i"]
console.log( m.input ); // 整个字符串,“is as cs”
console.log( m.index ); // is在整个字符串中的位置,位置是0
console.log( reg.lastIndex ); // 下一次匹配开始的位置,is后面的空格,位置是2
}
} while ( m ); // 只要m不是null就继续搜索
RegExp对象还包含一些属性,这些属性不是实例化的对象属性,它们是RegExp对象的属性,我们可以看做是静态属性:
Input:最近一次要匹配的字符串;
lastMatch: 最近一次的匹配项;
lastParen:最近一次的匹配分组;
leftContext:最近一次匹配字符串即Input中,lastMatch左边的字符串;
rightContext:最近一次匹配字符串即Input中,lastMatch右边的字符串;
$1,$2,$3...:在调用exec和text方法时,这些属性会依次表示所有的捕获分组;
浙公网安备 33010602011771号