不重复的正则表达式排列

问题描述 投票:0回答:2

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

对于字符串“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 处找到重合。

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

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

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

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

现在,当我有像 abbc 这样的重复字符(12 种组合)时,我需要执行相同的操作。

regex permutation
2个回答
0
投票
([abc])(?!\1)([abc])(?!\2|\1)[abc]

您可以使用不带

g
标志来获取位置。请参阅演示。第一组的位置就是您想要的。

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

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


0
投票

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

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

// 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('|'));
© www.soinside.com 2019 - 2024. All rights reserved.