regex 如何替换分隔符之间的重复字符串?

jpfvwuh4  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(133)

我需要替换分隔符中的一个文本序列,精确地替换它出现的次数。例如,我有这样的文本:

  1. "Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH too but it doesn't moo; bah!"

字符串
我想替换每一个“哞;“&”和“RGH”之间有一个“A”,所以我期望:

  1. "Cow says &ARGH but also &AAARGH and &AAAAARGH but it doesn't moo; bah!"


换句话说,我必须替换每一个“哞;“&”和“RGH”之间的“A”。我必须通过JavaScript使用单个regexp在整个文本上替换它(如果可能的话)我做了很多尝试,例如:

  1. var a="Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH but it doesn't moo; bah!"
  2. a=a.replace(/(?<=&)((moo;)\1?)+RGH/g,"A");
  3. // a=a.replace(/&(moo;)+RGH/g,"A")
  4. // a=a.replace(/&(?=moo;)\1RGH/g,"A"
  5. console.log(a);


但没有明显的成功。这个想法是,每一个“哞;必须用“A”替换,只有当与其他“moo”沿着出现时;“s在“&”和“RGH”之间
有什么建议吗?谢谢你,谢谢

xuo3flqw

xuo3flqw1#

您可以将(moo;)*放入lookbehind和lookahead判断提示中。这样,正则表达式将匹配&RGH之间的所有moo:

  1. var a="Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH but it doesn't moo; bah!"
  2. a=a.replace(/(?<=&(moo;)*)moo;(?=(moo;)*RGH)/g, 'A');
  3. console.log(a);

字符串
基准测试:


的数据

  1. <script benchmark data-count="1000000">
  2. let a = "Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH too but it doesn't moo; bah!";
  3. // @benchmark Unmitigated
  4. a.replace(/(?<=&)(moo;)+(?=RGH)/g, m => 'A'.repeat(m.length / 4));
  5. // @benchmark Alexander
  6. a.replace(/(?<=&(moo;)*)(moo;)(?=(moo;)*RGH)/g, 'A');
  7. </script>
  8. <script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>

展开查看全部
pw136qt2

pw136qt22#

您还可以匹配moo;的所有连续序列,并向String#replace传递一个回调函数,该回调函数根据每个序列的长度替换每个序列。

  1. let str = "Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH too but it doesn't moo; bah!";
  2. let res = str.replace(/(?<=&)(moo;)+(?=RGH)/g, m => 'A'.repeat(m.length / 4));
  3. console.log(res);

字符串

irlmq6kh

irlmq6kh3#

因为你想替换每个出现的 “moo;“,您将只希望匹配单个出现,而不是一个序列。
您可以使用 look-around 语法来Assert “moo;“

  1. (?<=&|moo;)moo;(?=RGH|moo;)

字符串

  1. var string = 'Cow says &moo;RGH but also &moo;moo;moo;RGH and &moo;moo;moo;moo;moo;RGH too but it doesn\'t moo; bah!'
  2. string = string.replace(/(?<=&|moo;)moo;(?=RGH|moo;)/g, 'A')
  3. console.log(string)

相关问题