码迷,mamicode.com
首页 > 其他好文 > 详细

String.prototype.replace( )

时间:2021-04-15 12:16:32      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:res   捕获组   xxx   code   lazy   ocs   func   lang   dex   

调用replace()找出每一个匹配的结果是相互独立的。先看例子:

var text  = "cat,bat,sat,fat";
var pattern = /(.at)/g;
var res = text.replace(pattern,‘world($1,$2)‘);
//world(cat,$2),world(bat,$2),world(sat,$2),world(fat,$2)

我的理解是,replace用模式pattern去匹配,第一次匹配到了cat,因为有括号所以记下了该捕获组,可以通过$1来引用该字符子串,然后replace接着往后匹配,这是第二次,而且相对第一次是独立的,这次匹配到的是bat,于是通过$1可以引用bat。依次匹配,各自的$1都是最新的一次匹配的第一个捕获组的引用,所以替换是才各不相同。
可以通过修改模式pattern来验证,这次是一次匹配两个单词

var text  = "cat,bat,sat,fat";
var pattern = /(.at)\S(.at)/g;
var res = text.replace(pattern,‘world($1,$2)‘);
//world(cat,bat),world(sat,fat)

加括号和不加括号的区别是前者可以对捕获组进行引用

可以看到,上面的匹配中,每一次都是独立的,就有点像是循环,所以使用行内函数和正则来避免循环
输入:
一个由 x,- 和 _ 组成的字符串。

x-x_

---x---x---x---

-xxx-xx-x-

_x_x___x___x___

输出:

一个数组对象。‘x‘ 产生一个 ‘on‘ 状态,‘-‘(连接符)产生一个 ‘off‘ 状态,而 ‘_‘ (下划线)表示 ‘on‘ 状态的长度。

[
  { on: true, length: 1 },
  { on: false, length: 1 },
  { on: true, length: 2 }
  ...
]

代码片段:

var str = ‘x-x_‘;
var retArr = [];
str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
  if (p1) { retArr.push({ on: true, length: p1.length }); }
  if (p2) { retArr.push({ on: false, length: 1 }); }
});

console.log(retArr);

技术图片

不难看出,p1相当于$1,p2相当于$2

感谢阅读!

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

String.prototype.replace( )

标签:res   捕获组   xxx   code   lazy   ocs   func   lang   dex   

原文地址:https://www.cnblogs.com/liulangbxc/p/14658911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!