【问题标题】:Regex permutations without repetition [duplicate]没有重复的正则表达式排列[重复]
【发布时间】:2015-06-09 17:18:32
【问题描述】:

我需要一个正则表达式来检查是否可以在字符串中找到表达式。

对于字符串“abc”,我想匹配任何排列的第一次出现而不重复,在本例中为 6:abc、acb、bac、bca、cab、cba。

例如,在这个字符串“adesfecabefgswabdcbaes”中,它会在位置 7 处找到一个巧合。

此外,对于没有像“abbc”这样的重复的排列,我也需要相同的方法。这种情况是12:acbb,abcb,abbc,cabb,cbab,cbba,bacb,babc,bcab,bcba,bbac,bbca

例如,在这个字符串“adbbcacssesfecabefgswabdcbaes”中,它会在位置 3 处找到一个巧合。

另外,我想知道类似情况会怎样。

编辑 我不是在寻找排列组合,不。我已经有了这些。我正在寻找的是一种检查这些排列中的任何一个是否在给定字符串中的方法。

编辑 2 我认为这个正则表达式涵盖了我的第一个问题 ([abc])(?!\1)([abc])(?!\2|\1)[abc]

可以在任何字符序列中找到“abc”的所有排列(6)。

现在,当我有 abbc 之类的重复字符(12 种组合)时,我需要这样做。

【问题讨论】:

  • 没有重复的无限集合的排列不是常规语言。正则表达式是错误的工具。
  • 没有正则表达式运算符来表示“字符串的排列”。您必须计算它们以构建该正则表达式。
  • 感谢您的回答,我已经有一个创建所有排列的程序,事实上我确实有这些组合。我需要检查这些组合中的任何一个是否超过 200 万个字符串,我需要检查巧合......这就是我认为正则表达式可能是一个很好的解决方案的原因
  • 致重新开放的选民:正则表达式对于这个问题来说是一个糟糕的解决方案。该问题已在重复问题中以更好的方式解决。
  • 当您必须检查超过 500 万个组合以查看是否可以匹配 6、12 或 400 个排列中的任何一个时,我可以告诉您正则表达式是最好的解决方案...

标签: regex permutation


【解决方案1】:
([abc])(?!\1)([abc])(?!\2|\1)[abc]

你可以用这个不带g标志来获取位置。见demo。第一组的位置就是你想要的。

https://regex101.com/r/nS2lT4/41

https://regex101.com/r/nS2lT4/42

【讨论】:

  • 这不能一概而论..它对[abbc]失败
  • 现在aba 失败了。
  • @vks 我的意思是 OP 的第二种情况.. :P
  • @vks 要么你应该再读一遍这个问题.. 或者我应该.. 我刚刚做了:P
  • @vks 很简单.. 你是为abc.. 做的,你可以为abcd.. 做类似的事情。如果是abbc?..
【解决方案2】:

您可能“需要正则表达式”的唯一原因是您使用的库或工具只允许使用正则表达式指定某些类型的规则。例如,可以自定义某些编辑器以特定方式为某些句法结构着色,并且它们只允许将这些结构指定为正则表达式。

否则,您不需要“正则表达式”,而是“需要程序”。这是一个:

// are two arrays equal?
function array_equal(a1, a2) {
  return a1.every(function(chr, i) { return chr === a2[i]; });
}

// are two strings permutations of each other?
function is_permutation(s1, s2) {
  return array_equal(s1.split('').sort(), s2.split('').sort());
}

// make a function which finds permutations in a string
function make_permutation_finder(chars) {
  var len = chars.length;
  return function(str) {
    for (i = 0; i < str.length - len; i++) {
      if (is_permutation(chars, str.slice(i, i+len))) return i;
    }
    return -1; 
  };
}

> finder = make_permutation_finder("abc");
> console.log(finder("adesfecabefgswaswabdcbaes"));
< 6

正则表达式远不足以做这种事情。

但是,还有一种替代方法,即预先计算排列并构建动态正则表达式来查找它们。您没有提供语言标签,但这是 JS 中的示例。假设您有排列并且不必担心转义特殊的正则表达式字符,那就是

regexp = new RegExp(permuations.join('|'));

【讨论】:

  • 感谢您的回答,我已经有一个创建所有排列的程序,事实上我确实有这些组合。我需要检查这些组合中是否有超过 200 万个字符串,我需要检查巧合......这就是我认为正则表达式可能是一个很好的解决方案的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多