正则表达式匹配置换的字符集

时间:2014-07-22 15:42:39

标签: regex parsing permutation

我希望匹配以所有六个字符abcdef开头的字符串,而不管这六个字符出现在字符串开头的顺序。

所有六个字符必须出现一次,并且只能出现一次,在字符串的前六个字符中,以产生匹配。

e.g。 “dfabce ......”是匹配,但“aacdef ......”不是。

正则表达式可以执行此操作,还是需要解析器?

1 个答案:

答案 0 :(得分:4)

当然,你可以用积极的先行断言来做到这一点:

^(?=.{0,5}a)(?=.{0,5}b)(?=.{0,5}c)(?=.{0,5}d)(?=.{0,5}e)(?=.{0,5}f).*

这样可以确保字母af分别出现在字符串的前6个字符中。

或者使用否定的先行断言:

^(?!(.).{0,4}\1|.(.).{0,3}\2|..(.).?.?\3|...(.).?\4|....(.)\5)[a-f]{6}

是的,我知道这看起来有点疯狂,但基本上,它会确保前6个字符为af以及第一个,第二个,第三个,第四个或第五个字符字符在前6个字符中不重复。您需要进行许多不同的更改,因为您不希望超前条件在前6个字符之后“流血”(即您希望匹配"dfabcee")。

或者,如果您选择的平台支持它,您可以使用lookbehind:

^(([a-f])(?<!\2.*\2)){6}

这将确保前6个字符为af,并且它们不会出现在相同字符的实例之后。