正则表达式排列没有重复

时间:2015-06-09 17:18:32

标签: regex permutation

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

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

例如,在这个字符串“adesfecabefgswaswabdcbaes”中,它会在第7位发现巧合。

我也需要相同的排列而不重复像这样的“abbc”。这种情况是12:acbb,abcb,abbc,cabb,cbab,cbba,bacb,babc,bcab,bcba,bbac,bbca

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

另外,我想知道对于类似的案件会是怎样的。

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

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

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

现在我需要做同样的事情,因为我有像abbc这样的重复角色(12种组合)。

2 个答案:

答案 0 :(得分:0)

([abc])(?!\1)([abc])(?!\2|\1)[abc]

你可以在没有g标志的情况下使用它来获得位置。参见demo。第一组的位置就是你想要的。

inner join

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

答案 1 :(得分:0)

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

否则,你不需要正则表达式#34;你需要一个程序"。这是一个:

// 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

Regexs远远不够强大,无法做到这一点。

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

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