正则表达式--RegExp对象

正则表达式是通过RegExp对象来表示的。除了RegExp()构造函数之外,RegExp对象还支持三个方法和一些属性。接下来会对RegExp模式匹配方法和属性展开讲述。

RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,RegExp()用以创建新的RegExp对象。第一个参数包含正则表达式的主体部分,也就是正则表达式直接量中两条斜线之间的文本。需要注意的是,不论是字符串直接量还是正则表达式,都使用“\”字符作为转义字符的前缀,因此当给RegExp()传入一个字符串表述的正则表达式时,必须将“\”替换成“\\”。RegExp()的第二个参数是可选的,如果提供第二个参数,它就指定正则表达式的修饰符。不过只能传入修饰符g、i、m或者它们的组合。比如:

//全局匹配字符串中的5个数字,注意这里使用了"\\",而不是"\"
var zipcode=new RegExp("\\d{5}","g");
RegExp()构造函数非常有用,特别是在需要动态创建正则表达式的时候,这种情况往往没办法通过写死在代码中的正则表达式直接量来实现。例如,如果待检索的字符串是由用户输入的,就必须使用RegExp()构造函数,在程序运行时创建正则表达式。

  • RegExp的属性

每个RegExp对象都包含5个属性。属性source是一个只读的字符串,包含正则表达式的文本。属性global是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g。属性ignoreCase也是一个只读的布尔值,用以说明正则表达式是否带有修饰符i。属性multiline是一个只读的布尔值,用以说明正则表达式是否带有修饰符m。最后一个属性lastIndex,它是一个可读/写的整数。如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec()和test()方法用到,下面会讲到。

  • RegExp的方法

RegExp对象定义了两个用于执行模式匹配操作的方法。它们的行为和上文介绍过的String方法很类似。RegExp最主要的执行模式匹配的方法是exec(),它与10.2节介绍过的String方法match()相似,只是RegExp方法的参数是一个字符串,而String方法的参数是一个RegExp对象。exec()方法对一个指定的字符串执行一个正则表达式,简言之,就是在一个字符串中执行匹配检索。如果它没有找到任何匹配,它就返回null,但如果它找到了一个匹配,它将返回一个数组,就像match()方法为非全局检索返回的数组一样。这个数组的第一个元素包含的是与正则表达式相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的子串。属性index包含了发生匹配的字符位置,属性input引用的是正在检索的字符串。

和match()方法不同,不管正则表达式是否具有全局修饰符g,exec()都会返回一样的数组。回忆一下,当match()的参数是一个全局正则表达式时,它返回由匹配结果组成的数组。相比之下,exec()总是返回一个匹配结果,并提供关于本次匹配的完整信息。当调用exec()的正则表达式对象具有修饰符g时,它将把当前正则表达式对象的lastIndex属性设置为紧挨着匹配子串的字符位置。当同一个正则表达式第二次调用exe c()时,它将从lastIndex属性所指示的字符处开始检索。如果exec()没有发现任何匹配结果,它会将lastIndex重置为0(在任何时候都可以将lastIndex属性设置为0,每当在字符串中找最后一个匹配项后,在使用这个RegExp对象开始新的字符串查找之前,都应当将lastIndex设置为0)。这种特殊的行为使我们可以在用正则表达式匹配字符串的过程中反复调用exec(),比如:

var pattern=/Java/g;
var text="JavaScript is more fun than Java!";
var result;
while((result=pattern.exec(text))!=null){
    alert("Matched'"+result[0]+"'"+
        "at position"+result.index+
        ";next search begins at"+pattern.lastIndex);
}

另外一个RegExp方法是test(),它比exec()更简单一些。它的参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true:

var pattern=/java/i;
pattern.test("JavaScript");//返回true

调用test()和调用exec()等价,当exec()的返回结果不是null时,test()返回true。由于这种等价性,当一个全局正则表达式调用方法test()时,它的行为和exec()相同,因为它从lastIndex指定的位置处开始检索某个字符串,如果它找到了一个匹配结果,那么它就立即设置lastIndex为当前匹配子串的结束位置。这样一来,就可以使用test()来遍历字符串,就像用exec()方法一样。

与exec()和test()不同,String方法search()、replace()和match()并不会用到lastIndex属性。实际上,String方法只是简单地将lastIndex属性值重置为0。如果让一个带有修饰符g的正则表达式对多个字符串执行exec()或test(),要么在每个字符串中找出所有的匹配以便将lastIndex自动重置为零,要么显式将lastIndex手动设置为0(当最后一次检索失败时需要手动设置lastIndex)。如果忘了手动设置lastIndex的值,那么下一次对新字符串进行检索时,执行检索的起始位置可能就不是字符串的开始位置,而可能是任意位置[7]。当然,如果RegExp不带有修饰符g,则不必担心会发生这种情况。同样要记住,在ECMAScript 5中,正则表达式直接量的每次计算都会创建一个新的RegExp对象,每个新RegExp对象具有各自的lastIndex属性,这势必会大大减少“残留”lastIndex对程序造成的意外影响。

猜你喜欢

转载自blog.csdn.net/wuyufa1994/article/details/86186026