我们已经知道,正则表达式是用RegExp对象来表示的。RegExp类的一个不寻常的特性就是它既定义了类属性,又定义了实例属性。也就是说,它既定义了属于构造函数RegExp( )的全局属性,又定义了其他属于单独的RegExp对象的属性。
构造函数RegExp( )有一个或两个字符串参数,它将创建一个新的RegExp对象。该构造函数的第一个参数是包含正则表达式主体的字符串,即正则表达式直接量中出现在斜线对之间的文本。注意,无论是字符串直接量还是正则表达式都使用了字符\表示转义序列,所以当将正则表达式作为字符串直接量传递给RegExp( )时,必须使用\\替换所有\字符。RegExp( )的第二个参数是可选的。如果提供了这个参数,它说明的就是该正则表达式的标志。它应该是“g”、“i”、“m”或它们的组合。例如:
var zipcode=new RegExp("\\d{5}","g");
当要动态创建一个正则表达式,而不能用正则表达式直接量的语法来表示时,构造函数RegExp( )非常有用。例如,如果检索的字符串是由用户输入的,那么就必须在运行时用RegExp( )构造函数来创建正则表达式。
① 用于模式匹配的RegExp( )方法
RegExp( )对象定义了两个用于执行模式匹配操作的方法。它们的行为和前面介绍过的String方法很相似。
Ⅰ. exec( ):
主要的RegExp模式匹配方法是exec( )。它与String的match( )方法相似,不同的是exec( )以字符串为参数。
exec( )方法对一个指定的字符串执行一个正则表达式,简而言之,就是在一个字符串中检索匹配。
⑴ 如果没有找到任何匹配,它将返回null。
⑵ 但是,如果它找到了一个匹配,将返回一个数组,就像方法match( )为非全局检索返回的数组一样。这个数组的元素0包含的是与正则表达式相匹配的字符串,余下的所有元素包含的是与括号括起来的子表达式相匹配的子串。而且,属性index包含了匹配发生的字符的位置,属性input引用的是被检索的字符串。
和match( )方法不同的是,exec( )返回的数组类型相同,无论该正则表达式是否具有全局标记g。
回忆一下,当传递给方法match( )的是一个全局正则表达式时,它返回的是一个匹配的数组。相比之下,方法exec( )返回的总是一个匹配,而且提供关于该匹配的完整信息。当一个具有g标志的正则表达式调用exec( )时,它将把该对象的lastIndex属性设置到紧接着匹配子串的字符位置。当同一个正则表达式第二次调用exec( )时,它将从lastIndex属性所指示的字符处开始检索。如果exec( )没有发现任何匹配,它会将lastIndex( )属性重置为0。这一特殊的行为使得可以反复调用exec( )遍历一个字符串中所有匹配的正则表达式。例如:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<script>
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);
}
</script>
</body>
</html>
Ⅱ. test( ):
另一个RegExp方法是test( )。它的参数是一个字符串,如果这个字符串包含正则表达式的一个匹配,它就返回true:
var pattern=/java/i;
pattern.test("JavaScript"); //true
调用test( )方法等价于调用exec( )方法,如果exec( )的返回值不是null,它将返回true。由于这种等价性,当一个全局正则表达式调用方法test( )时,它的行为和方法exec( )相同,即它从lastIndex指定的位置开始检索特定的字符串,如果它发现了匹配,就将lastIndex设置为紧接在那个匹配之后的字符的位置。这样一来,我们就可以使用方法test( )来遍历字符串,就像用exec( )方法那样。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<script>
var pattern=/Java/g;
var text="JavaScript is more fun than Java";
while(pattern.test(text)){
alert("Matched 'Java'"+
", next search begins at "+pattern.lastIndex);
}
</script>
</body>
</html>
② RegExp的实例属性
每个RegExp对象都有五个属性。
属性 | 含义 |
source | 只读字符串,存放的是正则表达式的文本 |
global | 只读的布尔值,说明了该正则表达式是否具有标志g |
ignoreCase | 只读的布尔值,说明了该正则表达式是否具有标志i |
multiline | 只读的布尔值,说明了该正则表达式是否具有标志m |
lastIndex | 可读写的整数。对于具有标志g的模式,这个属性存储在字符串中下一次开始检索的位置 |