用于匹配重复子字符串的单个 js 正则表达式

single js regex for matching repeating substrings?

本文关键字:单个 js 正则表达式 字符串 用于      更新时间:2023-09-26

>假设我有一个字符串,比如:

where is mummy where is daddy

我想用空字符串替换任何一组重复的子字符串 - 所以在这种情况下,whereis元素将被删除,生成的字符串将是:

mummy daddy

我想知道是否有任何单一的正则表达式可以实现这一点。我尝试的正则表达式(不起作用)如下所示:

/('w+)(?=.*)'1/gi

其中第一个捕获组是任何一组单词字符,第二个捕获组是对任何字符集的正面展望(以防止这些字符包含在结果中),然后'1是对第一个匹配子字符串的反向引用。

任何帮助都会很棒。提前感谢!

您的正则表达式不起作用,因为'w+不受单词边界的限制,并且'1反向引用试图在"原始"单词之后进行匹配,这几乎永远不会正确。

您需要首先获取被欺骗的单词,然后构建一个正则表达式以将它们全部与可选的空格(或标点符号等 - 稍后调整模式)匹配并替换为空字符串:

var re = /('b'w+'b)(?=.*'b'1'b)/gi;                  // Get the repeated whole words
var str = 'where is mummy where is daddy';
var patts = str.match(re);                       // Collect the matched repeated words
var res = str.replace(RegExp("''s*''b(?:" + patts.join("|") +")''b", "gi"), ""); //  Build the pattern for replacing all found words
document.body.innerHTML = res;

第一种模式('b'w+'b)(?=.*'b'1'b)

  • ('b'w+'b) - 匹配并捕获由[A-Za-z0-9_]个字符组成的整个单词到第1组中
  • (?=.*'b'1'b) - 确保捕获到组 1 中的此值在当前位置右侧的某个位置重复(不一定紧跟在单词之后)。如果字符串是多行的,请使用['s'S]而不是点。为了确保我们将原始单词和重复单词作为整个单词匹配,应在'w+'1周围使用'b单词边界。

第二种模式每次看起来都不同,但在当前方案中,它将/'s*'b(?:where|is)'b/gi

  • 's* - 零个或多个白蛋白
  • 'b(?:where|is)'b - 交替组(?:...|...)的整个单词:whereis(由于修饰符/i不区分大小写)。