标签: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
标签:res 捕获组 xxx code lazy ocs func lang dex
原文地址:https://www.cnblogs.com/liulangbxc/p/14658911.html