感谢Kobi,我只解决了检查所有排列而不重复给定字符串“abbc”的问题。这是解决方案
(?:(?<A>a)|(?<B>b)|(?<C>c)){4}(?<-A>)(?<-B>){2}(?<-C>)
表达式必须有4个连续字符中的一个“a”,两个“b”和一个“c”。
现在我需要更复杂的东西,我需要检查一个带有2个排列块的表达式:
我不知道自己是否解释得很好,但是:
我试图以最好的方式解释它。对不起,它看起来像是一个不是的复制粘贴。
我正在寻找的正则表达式是“abXccc-abccc”,其中X可以是a,b或c,并且 - 将2个块分开,虽然它们在一起我正在添加 - 因为对于前6个字符我必须寻找所有的组合,并在最后5个相同。
它不一定是这样,它可能是类似的东西,这只是一个例子。例如,它可能是“aabXXcc-abbc”。
答案 0 :(得分:2)
将the previous pattern改编为新版本很简单。
第二个块很简单:
(?:(?<A>a)|(?<B>b)|(?<C>c)){5}(?<-A>)(?<-B>)(?<-C>){3}
接下来,您唯一需要知道的是您可以多次指定同一个组。 Martin Büttner's answer对此进行了解释,我之前已将其链接过来。
因此,第一个位置[abc]
位于第一个位置,可以写成:
(?:(?<A>a)|(?<B>b)|(?<C>c)){2}[abc](?:(?<A>a)|(?<B>b)|(?<C>c)){3}(?<-A>)(?<-B>)(?<-C>){3}
组合:
(?:(?<A>a)|(?<B>b)|(?<C>c)){2}[abc](?:(?<A>a)|(?<B>b)|(?<C>c)){3}(?<-A>)(?<-B>)(?<-C>){3}-(?:(?<A>a)|(?<B>b)|(?<C>c)){5}(?<-A>)(?<-B>)(?<-C>){3}
或者,使用Ignore Whitespace标志:
(?:(?<A>a)|(?<B>b)|(?<C>c)){2} # Match 2 a, b, or c's
[abc] # Match a, b, or c, but don't push to stack.
(?:(?<A>a)|(?<B>b)|(?<C>c)){3} # Match 3 a, b, or c's
(?<-A>)(?<-B>)(?<-C>){3} # Check we've matched 1 a, 1 b and 3 c's.
- # match the dash
(?:(?<A>a)|(?<B>b)|(?<C>c)){5} # Match 5 a, b, or c's
(?<-A>)(?<-B>)(?<-C>){3} # Check we've matched 1 a, 1 b and 3 c's.
这不是那么优雅(它有一些重复),但作为上一个问题的下一步仍然应该很容易理解。