我需要一个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种组合)。
答案 0 :(得分:0)
([abc])(?!\1)([abc])(?!\2|\1)[abc]
你可以在没有g
标志的情况下使用它来获得位置。参见demo。第一组的位置就是你想要的。
答案 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('|'));