String对象支持四种利用正则表达式的方法,分别是search()、replace()、match()和split()。下面我们逐一进行讲解。
search()检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串:
search()方法应该是这四个方法中最简单的一个。其以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的子串,其返回-1。
var str = 'Welcome to xiaoxiaozi.com' ;
document. write (str. search ( /xiaoxiaozi/ ) ) ;
//返回-1,因为我没有指定模式i
var str = 'Welcome to xiaoxiaozi.com' ;
document. write (str. search ( /XIAOXIAOZI/ ) ) ;
//返回11,因为我指定了模式为i
var str = 'Welcome to xiaoxiaozi.com' ;
document. write (str. search ( /XIAOXIAOZI/i ) ) ;
刚才示例中参数我传的是正则表达式,如果search()的参数不是正则表达式,它首先将被传递给RegExp构造函数,转换成正则表达式。不过这里需要注意的一下是search()不支持全局检索,因为它忽略了正则表达式参数标志g。
replace() 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串:
方法replace()执行检索与替换操作。它的第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。它将检索调用它的字符串,根据指定的模式来匹配。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与模式匹配的子串,否则它只替换所发现的第一个与模式匹配的子串。
如果replace()的第一个参数是字符串,而不是正则表达式,该方法将直接检索那个字符串,而不是像search()那样用RegExp()构造函数将它转换成一个正则表达式。
刚才我们给出的示例中,replace()的第二个参数都是字符串,其实其第二个参数还可以是函数,该函数能够动态地计算替换字符串,并且其函数的参数顺序分别为:匹配整体正则的字符串,匹配模式1的字符串,匹配模式2的字符串…。
name = 'aaa bbb ccc' ;
uw = name. replace ( //b/w+/b/g , function (word ) {
return word. substring ( 0 , 1 ). toUpperCase ( ) +word. substring ( 1 ) ; }
) ;
document. write (uw ) ;
match() 可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配:
match()方法是最常用的String方法,它唯一的参数就是一个正则表达式(或把它的参数传递给构造函数RegExp() 以转换成正则表达式),返回的是包含了匹配结果的数组。如果该正则表达式有标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。
var str = '1a 2b 3c 4d' ;
var pattern = //d+/g ;
var result = str. match (pattern ) ;
for (i in result )
{
document. write (result [i ] ) ;
}
如果match()参数中没有设置g标志,其进行的就不是全局检索,但是仍然返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,而余下的元素则是天上则表达工中用括号括起来的子表达式。其返回的数组为result,result[0]存放的是完整匹配,result[1]存放的是$1匹配的内容,和replace()第二个函数参数一致。
i is 0 http://www.xiaoxiaozi.com/index.php
i is 1 http
i is 2 www.xiaoxiaozi.com
i is 3 index.php
i is index 11
i is input my home is http://www.xiaoxiaozi.com/index.php
*/
var str = 'my home is http://www.xiaoxiaozi.com/index.php' ;
var pattern = /(/w+):([/w.]+)//(/S*)/ ;
var result = str. match (pattern ) ;
for (i in result )
{
document. write ( "i is " +i + " " +result [i ] + "<br/>" ) ;
}
此例我们可以看出,其如果作用于一个非全局的正则表达式,那么match()返回的数组还包括另外两个属性——index和input,前者包含的是在字符串中匹配开始处的字符的位置,后者则是目标字符串的一个副本。
String对象的最后一个有关正则表达式的方法是split(),此方法可以通过分隔符把调用它的字符串分隔为一个子串数组。其分隔符可以是字符,字符串,也可以是正则表达式。
用一个空格分隔字符串
my
home
page
is
http://www.xiaoxiaozi.com
*/
var str = 'my home page is http://www.xiaoxiaozi.com' ;
var result = str. split ( " " ) ;
for ( i in result )
{
document. write (result [i ] + "<br/>" ) ;
}
上例没有用正则表达式,可是如果我的字符串中有空多个格咋办?还有此方法得出的结果就不准确了啊,没事,咱不是有正则表达式呢吗?/s匹配的就是任何Unicode空格符,咱怕啥?
使用正则表达式/s+一个或多个空格来分隔字符串
my
home
page
is
http://www.xiaoxiaozi.com
*/
var str = 'my home page is http://www.xiaoxiaozi.com' ;
var result = str. split ( //s+/ ) ;
for ( i in result )
{
document. write (result [i ] + "<br/>" ) ;
}