繁体   English   中英

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

[英]single js regex for matching repeating substrings?

说我有一个字符串,如:

where is mummy where is daddy

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

mummy daddy

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

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

第一个捕获组是任何一组字符,第二个是对任何字符集的正面预测(为了防止这些字符被包含在结果中),然后\\1是对第一个匹配的反向引用子。

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

你的正则表达式不起作用,因为\\w+不受字边界限制,并且\\1反向引用试图在“原始”单词之后匹配,这几乎不是真的。

你需要首先得到dupes的单词,然后构建一个RegExp,将它们全部与可选的空格(或标点符号等)相匹配 - 稍后调整模式并用空字符串替换:

 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]而不是点。 为了确保我们将原始单词和欺骗单词匹配为整个单词, \\b应在\\w+\\1周围使用单词边界。

第二种模式每次都会有所不同,但在当前情况下,它将是/\\s*\\b(?:where|is)\\b/gi

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM