我正在编写一个递归替换字符串中正则表达式匹配项的函数。替换内容可以是一个函数,就像普通的
我希望我的函数每次迭代只替换一个匹配项。对于非全局正则表达式,这总是成立的。然而,这个函数接收到的一些正则表达式将是全局的。使用传统的
例如:
当期望的输出为:
我应该如何让函数在每次迭代中只处理一个匹配项,无论正则表达式是否带有 g 标志?请注意,我使用的函数总是将第二个参数作为正则表达式(我无法控制这一点,也无法控制所述正则表达式是否带有 g 标志)。
.replace
一样,而且这个函数可以通过其中一个参数访问原始字符串。我希望我的函数每次迭代只替换一个匹配项。对于非全局正则表达式,这总是成立的。然而,这个函数接收到的一些正则表达式将是全局的。使用传统的
.replace(正则表达式,替换内容)
意味着它可能在每次迭代中多次替换,不仅会打乱处理匹配项的顺序,而且还会向替换函数传递错误的索引和原始字符串。例如:
function recursiveReplace(string, regex, replacement) {
for (var i = 1e8; i > 0 && regex.test(string); i--)
string = string.replace(regex, replacement);
return string;
}
console.log(
recursiveReplace("abcdef", /../g, function (match, index, original) {
console.log(original);
return match[0];
})
);
这将输出
abcdef
abcdef
abcdef
ace
ae
a
当期望的输出为:
abcdef
acdef
adef
aef
af
a
我应该如何让函数在每次迭代中只处理一个匹配项,无论正则表达式是否带有 g 标志?请注意,我使用的函数总是将第二个参数作为正则表达式(我无法控制这一点,也无法控制所述正则表达式是否带有 g 标志)。
1e8
总是等于 1 吗? - user557597regex = RegExp(regex, regex.flags.replace('g', ''));
就可以解决问题了。我想问题解决了,但我不确定这在跨平台方面是否有效。 - ETHproductionsxey
或xEy
表示x * 10**y
(其中**
表示指数运算) - Nick stands with Ukraine