【问题标题】:RegularExpression - Regexp to find longest unique non overlapping cycles in a string正则表达式 - 正则表达式查找字符串中最长的唯一非重叠循环
【发布时间】:2017-03-15 20:40:15
【问题描述】:

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

我发现 (\w+?)\1+(适用于 Ruby)它就像单次重复的魅力。

'abcabcabcabc' #=> 'abc'

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

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

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

【问题讨论】:

  • 使用贪心量词:(\w+)\1+
  • 你为什么首先使用惰性量词?

标签: regex string language-agnostic recurrence substring


【解决方案1】:

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

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'));

输出

abc

【讨论】:

    【解决方案2】:

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

    (?=(\w+)\1)
    

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

    说明:

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

    abcabccabc
    

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

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

    【讨论】:

    • 是的,我也尝试过这个正则表达式来进行重叠匹配。尽管如此,它还需要正则表达式以外的东西。但是,点甚至不是必需的。
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2010-10-10
    • 2016-03-03
    • 1970-01-01
    • 2021-07-29
    • 2015-04-02
    相关资源
    最近更新 更多