RegExp对象

我们已经知道,正则表达式是用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的模式,这个属性存储在字符串中下一次开始检索的位置

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值