Regex 无重复的正则置换

Regex 无重复的正则置换,regex,permutation,Regex,Permutation,我需要一个正则表达式来检查是否可以在字符串中找到表达式 对于字符串“abc”,我希望不重复地匹配任何排列的第一次出现,在本例中为6:abc、acb、bac、bca、cab、cba 例如,在这个字符串“adesfecabefgswaswabdcbaes”中,它会在位置7处发现一个巧合 同样,我也需要同样的排列,而不是像这个“abbc”一样的重复。这种情况有12种:acbb、abcb、abbc、cabb、cbab、cbba、bacb、babc、bcab、bcba、bbac、bbca 例如,在这个字符

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

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

例如,在这个字符串“adesfecabefgswaswabdcbaes”中,它会在位置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个组合)这样的重复字符时,我也需要这样做

您可以在不使用
g
标志的情况下使用此选项来获取位置。请参阅演示。第一组的位置就是您想要的位置

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

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

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

这不能一概而论。。现在,它在
[abbc]
中失败,在
aba
中失败。@vks我指的是OP的第二个案例P@vks要么你应该把问题再读一遍。。或者我应该。。我就这么做了:P@vks这很简单。。你是为abc做的。。您也可以对
abcd
执行类似操作。。如果它是abbc,那该怎么办?…一个无限集没有重复的置换不是一种规则语言。正则表达式是错误的工具。没有正则表达式操作符来表示“字符串的排列”。你必须计算它们来构建正则表达式。谢谢你的回答,我已经有了一个程序来创建所有的排列,事实上我有这些组合。我需要的是检查这些组合中是否有超过200万个字符串,我需要检查这些巧合…这就是我认为regex可能是重新开放选民的一个好解决方案的原因:regex是解决这个问题的一个坏方法。这个问题在重复问题中得到了更好的解决。当你必须检查500多万个组合,看你是否能匹配6、12或400个排列中的任何一个时,我可以告诉你,正则表达式是最好的解决方案……感谢你的回答,我已经有了一个创建所有排列的程序,事实上,我有这些组合。我需要的是检查这些组合中是否有超过200万个字符串,我需要检查这些巧合…这就是我认为正则表达式可能是一个好的解决方案的原因
// 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
regexp = new RegExp(permuations.join('|'));