javascript基础学习系列六十一:字符串模式匹配方法

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 "&lt;";
          case ">":
            return "&gt;";
          case "&":
            return "&amp;";
          case "\"":
            return "&quot;";
        }
}); }
console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>")); // "&lt;p class=&quot;greeting&quot;&gt;Hello world!</p>"

这里,函数 htmlEscape()用于将一段 HTML 中的 4 个字符替换成对应的实体:小于号、大于号、 和号,还有双引号(都必须经过转义)。实现这个任务最简单的办法就是用一个正则表达式查找这些字 符,然后定义一个函数,根据匹配的每个字符分别返回特定的 HTML 实体。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值