String 类型专门为在字符串中实现模式匹配设计了几个方法。第一个就是 match()方法,这个方法本质上跟 RegExp 对象的 exec()方法相同。match()方法接收一个参数,可以是一个正则表达式字 符串,也可以是一个 RegExp 对象。来看下面的例子:
let text = "cat, bat, sat, fat";
let pattern = /.at/;
// 等价于pattern.exec(text)
let matches = text.match(pattern); console.log(matches.index); // 0 console.log(matches[0]); // "cat" console.log(pattern.lastIndex); // 0
match()方法返回的数组与 RegExp 对象的 exec()方法返回的数组是一样的:第一个元素是与整 个模式匹配的字符串,其余元素则是与表达式中的捕获组匹配的字符串(如果有的话)。
另一个查找模式的字符串方法是search()。这个方法唯一的参数与match()方法一样:正则表达 式字符串或 RegExp 对象。这个方法返回模式第一个匹配的位置索引,如果没找到则返回1。search() 始终从字符串开头向后匹配模式。看下面的例子:
let text = "cat, bat, sat, fat";
let pos = text.search(/at/);
console.log(pos); // 1
这里,search(/at/)返回 1,即"at"的第一个字符在字符串中的位置。
为简化子字符串替换操作,ECMAScript 提供了 replace()方法。这个方法接收两个参数,第一个 参数可以是一个 RegExp 对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是 一个字符串或一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字 符串,第一个参数必须为正则表达式并且带全局标记,如下面的例子所示:
console.log(result); // "cond, bat, sat, fat" 13
let text = "cat, bat, sat, fat";
let result = text.replace("at", "ond");
result = text.replace(/at/g, "ond");
console.log(result); // "cond, bond, sond, fond"
在这个例子中,字符串"at"先传给 replace()函数,而替换文本是"ond"。结果是"cat"被修改为"cond",而字符串的剩余部分保持不变。通过将第一个参数改为带全局标记的正则表达式,字符串 中的所有"at"都被替换成了"ond"。
第二个参数是字符串的情况下,有几个特殊的字符序列,可以用来插入正则表达式操作的值。 ECMA-262 中规定了下表中的值。
使用这些特殊的序列,可以在替换文本中使用之前匹配的内容,如下面的例子所示:
let text = "cat, bat, sat, fat";
result = text.replace(/(.at)/g, "word ($1)");
console.log(result); // word (cat), word (bat), word (sat), word (fat)
这里,每个以"at"结尾的词都会被替换成"word"后跟一对小括号,其中包含捕获组匹配的内容$1。 replace()的第二个参数可以是一个函数。在只有一个匹配项时,这个函数会收到 3 个参数:与整 个模式匹配的字符串、匹配项在字符串中的开始位置,以及整个字符串。在有多个捕获组的情况下,每 个匹配捕获组的字符串也会作为参数传给这个函数,但最后两个参数还是与整个模式匹配的开始位置和 原始字符串。这个函数应该返回一个字符串,表示应该把匹配项替换成什么。使用函数作为第二个参数
可以更细致地控制替换过程,如下所示:
function htmlEscape(text) {
return text.replace(/[<>"&]/g, function(match, pos, originalText) {
switch(match) {
case "<":
return "<";
case ">":
return ">";
case "&":
return "&";
case "\"":
return """;
}
}); }
console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>")); // "<p class="greeting">Hello world!</p>"
这里,函数 htmlEscape()用于将一段 HTML 中的 4 个字符替换成对应的实体:小于号、大于号、 和号,还有双引号(都必须经过转义)。实现这个任务最简单的办法就是用一个正则表达式查找这些字 符,然后定义一个函数,根据匹配的每个字符分别返回特定的 HTML 实体。