现在的位置: 首页 > 综合 > 正文

JavaScript:用于模式匹配的String方法

2013年10月14日 ⁄ 综合 ⁄ 共 2100字 ⁄ 字号 评论关闭

String的部分方法,在正则表达式中执行模式匹配、检索和替换操作。String支持四种利用正则表达式的方法:

① search( ):

该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的子串,它将返回-1。例如下面的调用返回4:

"JavaScript".search(/script/i);  //4

如果search( )的参数不是正则表达式,它首先将被传递给RegExp构造函数,转换成正则表达式。search( )不支持全局检索,因为它忽略了正则表达式参数的标志g。

② replace( ):

该方法执行检索与替换操作。它的第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。它将检索调用它的字符串,根据指定的模式来匹配。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与模式匹配的子串,否则它只替换所发现的第一个与模式匹配的子串。如果replace( )的第一个参数是字符串,而不是正则表达式,该方法将直接检索那个字符串,而不是像search(
)那样用RegExp( )构造函数将它转换成一个正则表达式。例如,我们可以用如下方法使用replace( )将文本字符串中的所有javascript(不区分大小写)统一为“JavaScript”:

<script>  
        var text="javascript and JAVAscript and c++";  
        alert(text.replace(/javascript/gi,"JavaScript"));  
</script> 

但是replace( )的功能远比上例所示强大。最值得注意的是,replace( )方法的第二个参数可以是函数,该函数能够动态地计算替换字符串。replace( )还有其他重要特性,这里不一一赘述。

③ match( ):

match( )方法是String最常用的正则表达式方法。它唯一的参数就是一个正则表达式(或把它的参数传递给构造函数RegExp( )以转换成正则表达式),返回的是包含了匹配结果的数组如果该正则表达式设置了标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。例如:

<script>
        alert("1 plus 2 equals 3".match(/\d+/g));  //1,2,3
</script>

如果该正则表达式没有设置标志g,match( )进行的就不是全局性检索,它只是检索第一个匹配。但即使match( )执行的不是全局检索,它也返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,而余下的元素则是正则表达式中用括号括起来的子表达式。因此如果match( )返回了一个数组a,那么a[0]存放的是完整的匹配,a[1]存放的则是与第一个用括号括起来的表达式匹配的子串,以此类推。为了和方法replace(
)保持一致,a[n]存放的是$n的内容。

例如使用如下的代码来解析一个URL:

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	
	</head>
	<body>
		<script>  
			var url=/(\w+):\/\/([\w.]+)\/(\S*)/;
			var text="visit my blog at http://www.example.com/david";
			var result=text.match(url);
		
			if(result!=null){
				var fullurl=result[0];
				var protocol=result[1];
				var host=result[2];
				var path=result[3];
				alert(fullurl+"\n"+protocol+"\n"+host+"\n"+path);
			}	
        	
    		</script>  
		
	</body>
</html>

最后,还应该了解match( )的一个特性。它返回的数组和其他的数组一样具有一个length属性。如果match( )是作用于一个非全局的正则表达式,那么它返回的数组还包括另外两个属性--index和input,前者包含的是在字符串中匹配开始处的字符的位置,后者则是目标字符串的一个副本。这样,在上面的代码中,result.index属性的值应该等于17,因为匹配了的URL是从文本中的第17个字符的位置开始。而属性result.input则应该具有和变量text相同的字符串。对于没有标志g的正则表达式r和字符串s,调用s.match(r)返回的值与r.exec(s)相同。我们会在后续文章中讨论RegExp.exec(
)方法。

④ split( ):

这个方法可以把调用它的字符串分解为一个子串数组,使用的分隔符是它的参数。例如:

"123,456,789".split(",");  //123,456,789

split( )方法也可以以正则表达式为参数。这种能力使该方法更强大。例如我们可以指定分隔符,允许两边有任意多个空白符:

"1,2, 3 , 4  ,5".split(/\s*,\s*/);  //1,2,3,4,5

split( )方法还有其他的特性,这里不一一赘述。

抱歉!评论已关闭.