regex 替代Javascript replaceAll处理边缘情况

icnyk63a  于 2023-04-22  发布在  Java
关注(0)|答案(1)|浏览(120)

旧版浏览器不支持Javascript的String.replaceAll。我看到的解决方法有问题:
如果搜索字符串中的字符在regexen中有特殊含义,例如$,则会失败。
或者它们在一个循环中重复。这在像NEENEEDLEDLE-replaceAll('NEEDLE')这样的情况下会失败,只会进行一次替换,而不是两次。
在旧浏览器中执行replaceAll的好方法是什么?我不需要完整的polyfill,也不需要正则表达式:简单地替换字符串B中所有出现字符串a。

23c0lvtd

23c0lvtd1#

.replaceAll()不能正常工作的原因是因为字符串是在它原来的未改变的值中搜索的。所以在第一个匹配之后,它会继续搜索,而不会替换任何匹配,直到它完成搜索。下面是每个匹配的结果字符串的例子。

示例-要搜索的字符串

`NeeNeedledle this part remains Needle`
.replaceAll()结果
第一场比赛NeeNeedledle this part remains Needle
第二场比赛NeeNeedledle this part remains Needle
退货Needle this part remains

因此,为了在字符串变化时找到每个匹配,并且仍然与任何浏览器兼容,请创建一个实现递归的函数。递归函数将通过调用自身并传递上一次迭代中更改的参数来迭代任务,直到给定条件不再适用。下面是递归函数每次匹配的结果字符串的示例。
| 递归函数|结果|
| --------------|--------------|
| 第一场比赛|Needle this part remains Needle|
| 第二场比赛|this part remains Needle|
| 第三场比赛|this part remains|
| 退货|this part remains|
下面的示例是一个递归函数,它替换每个匹配项,然后在每次迭代时搜索新的已修改字符串。

/**
 * Replace each match of a given substring within a given string as it 
 * changes.
 * @param {string} string - The string to search on.
 * @param {string/RegExp} target - The criteria to match.
 * @param {string} replacement - The string to replace a match with.
 * @default {string} If the replacement isn't passed, an empty character: "" 
 *                   will be passed.
 * @returns {string} A string with all replacements.
 */ 
 function substitute(string, target, replacement = "") {
   let result = string.replace(target, replacement);
   if (target.test(result)) {
     return substitute(result, target, replacement);
   }
   return result;
 }

 const str = `NeeNeedledle this part will remain Needle`;
 const rgx = /Needle/;

 console.log(substitute(str, rgx));

相关问题