javaScript中String对象与正则表达式有关的四个方法search、replace、match、split

作者:admin     字体:[增加 减小]    类型:原创
javaScript中String对象与正则表达式有关的四个方法search、replace、match、split,本文详细介绍这几个方法的使用。

JavaScript对象String支持4种使用下面是表达匿报方法。最简单的是search()。它的参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,它将返回-1。比如,下面的调用返回值为4:

'JavaScript'.search(/script/i);

如果search()参数不是正则表达式,则首先会通过RegExp构造函数将它转换成正则表达式,search()方法不支持全局检索,因为它忽略正则表达式参数中的修饰符g。

replace()方法用以执行检索与替换操作。其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。这个方法会对调用它的字符串进行检索,使用指定的模式来匹配。如果正则表达式中设置了修饰符g,那么源字符串中所有与模式匹配的子串都替换成第二个参数指定的字符串;如果不带修饰符g,则只替换所匹配的第一个子串。如果replace()方法的第一个参数是字符串而不是正则表达式,则replace()将直接搜索这个字符串,而不是像search()一样首先通过RegExp()将它转换为正则表达式。比如,可以使用下面的方法,利用replace()将文本中的所有javascript(不区分大小写)统一替换为“JavaScript”:

text.replace(/javascript/gi,'JavaScript');

但replace()的功能远不止这些。正则表达式中使用圆括号括起来的子表达式是带有从左到右的索引编号的,而且正则表达式会记忆与每个子表达式匹配的文本。如果在替换字符串中出现了$加数字,那么replace()将用指定的子表达式相匹配的文本来替换这个两个字符。这是一个非常有用的特性。比如,可以用它将一个字符串的英文引号替换为中文半角引号:

//一段引用文本起始于引号,结束于引号
//中间的内容区域不能包含引号
var quote = /"([^"]*)")/g;
//用中文半角引号替换英文绰号,同时要保持引号之间的内容没有被修改
text.replace(quote,'“$1”');

replace()方法的第二个参数可以是函数,该函数能够动态地计算替换字符串。

match()方法是最常用的String正则表达式方法。它的唯一参数就是一个正则表达式(或通过RegExp()构造函数将转换为正则表达式),返回的是一个由匹配结果组成的数组。如果该正则表达式设置了修饰符g,则该方法返回的数组包含字符串中的所有匹配结果。例如:

'1加2等于3'.match(/\d+/g); //返回['1','2','3'],各元素均为字符串

如果这个正则表达式没有设置修饰符g,match()就不会进行全局检索,它只检索第一个匹配。但即使match()执行的不是全局检索,它也返回一个数组。在这种情况下,数组的第一个元素就是匹配的字符串,余下的元素则是正则表达式中用圆括号括起来的子表达式。为了详细说明,请看下面的示例

'1加2等于3'.match(/\d+/); // ["1", index: 0, input: "1加2等于3"]
'1加2等于3'.match(/(\d+)/); //  ["1", "1", index: 0, input: "1加2等于3"]
'1加2等于3'.match(/(\d+)/g); //   ["1", "2", "3"]

可见,如果不带g,匹配带括号,match()返回的数组a[0]存放的是完整的匹配,a[1]存放的则是第一个用圆括号括起来的表达式相匹配的子串。

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

<script>
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "欢迎访问 http://www.popjb.com/cat_1.html";
var m = text.match(url);
console.log(m); //["http://www.popjb.com/cat_1.html", "http", "www.popjb.com", "cat_1.html", index: 5, input: "欢迎访问 http://www.popjb.com/cat_1.html"]
</script>

值得注意的是,给字符串的match()方法传入一个非全局的正则表达式,实际上和给这个正则表达式的exec()方法传入的字符串是一模一样的,它返回的数组带有两个属性:index和input。

String对象的最后一个和正则表达式相关的方法是split()。split()方法用以将调用它的字符串拆分为一个子串组成的数组,使用的分隔符是split()的参数,例如

'1,2,3,4'.split(',');  //返回['1','2','3','4']

split()方法的参数也可以是一个正则表达式,这使用split()方法异常强大。例如,可以指定分隔符允许两边可以留有任意多的空白符:

'1 ,2,  3  ,   4'.split(/\s*,\s*/); //返回['1','2','3','4']