RegularExpression - Regexp在字符串中查找最长的唯一非重叠循环

时间:2016-11-02 13:47:53

标签: regex string language-agnostic recurrence substring

我有一个字符串 - > ' abcabcabclslslsokjokjokj' 我需要找到一种能够识别所有重现的算法(或至少一个最长的唯一)

我发现(\w+?)\1+(适用于Ruby的作品)它的效果就像单次重现的魅力一样。

'abcabcabcabc' #=> 'abc'

'ababcababcababcababcababcababc'失败,预期结果为ababc,但结果为ab

我错在哪里,找到正确的方法是什么: -

  1. 第一个独特的循环模式(ababcababcababcjkjkjkjk => ababc) 2(奖金)。字符串中的所有唯一非重叠循环重复(ababcababcababcabhabhabhlklklk => ababcabhlk

2 个答案:

答案 0 :(得分:1)

Use this regex查找字符串中所有重复的子模式。

(?=(\w+)\1)

然后,您需要一些额外的代码来检查所有匹配的子组是否为最长的。

<强>解释

不仅仅需要一个简单的正则表达式,因为遇到的第一个重复模式将会吞噬&#34;吞噬&#34;匹配的字符串部分。并且该部分字符串不能再用于其他潜在的匹配。考虑这个例子:

abcabccabc

最长的重复模式是cabc,但是像(\w+)\1这样的简单正则表达式找不到这个模式,因为它会与abcabc匹配,然后不再查看该部分字符串。

正向前瞻(?=...),在匹配时不使用字符串,用于查找最长的潜在重复模式,并将其存储在捕获组中。这将从字符串中的每个字符开始检查。

答案 1 :(得分:0)

这是没有正则表达式(Regex)的javascript问题的解决方案

ACCESS HEALTH CT 

Connecticut All Payers Claims Database 

DATA SUBMISSION GUIDE 

December 5, 2013 

Version 1.2 (with clarifications) 

输出

const longestString = str => {
  obj = {};
  longest = [];
  current = [];
  for (let i=0; i<str.length; i++) {
    if (obj[str[i]] === undefined) {
      obj[str[i]] = 1;
      current.push(str[i]);
    } else {
      if (current.length > longest.length) {
        longest = [...current];
        current = [];
        obj = {};
        obj[str[i]] = 1;
        current.push(str[i]);
      }
    }
  }
  return longest.join('');
}

console.log(longestString('ababcababcababcababcababcababc'));