正则表达式的排列块

时间:2015-06-10 12:55:05

标签: c# regex

感谢Kobi,我只解决了检查所有排列而不重复给定字符串“abbc”的问题。这是解决方案

(?:(?<A>a)|(?<B>b)|(?<C>c)){4}(?<-A>)(?<-B>){2}(?<-C>)

表达式必须有4个连续字符中的一个“a”,两个“b”和一个“c”。

现在我需要更复杂的东西,我需要检查一个带有2个排列块的表达式:

  1. 在前6个位置,它必须找到“abccc”的所有排列,但在第3个位置添加一个可以是其中任何一个(a,b或c)的字符。
  2. 在第二个区块中,它必须找到“abccc”
  3. 的所有排列

    我不知道自己是否解释得很好,但是:

    1. 对于前6个位置,它必须有一个a,一个b,3 c,并且在第3个位置任何值(a,b或c),无论顺序除了第3个位置可以是任何
    2. 对于接下来的5个职位,无论顺序如何,都必须有一个a,一个b和3 c。
    3. 我试图以最好的方式解释它。对不起,它看起来像是一个不是的复制粘贴。

      我正在寻找的正则表达式是“abXccc-abccc”,其中X可以是a,b或c,并且 - 将2个块分开,虽然它们在一起我正在添加 - 因为对于前6个字符我必须寻找所有的组合,并在最后5个相同。

      它不一定是这样,它可能是类似的东西,这只是一个例子。例如,它可能是“aabXXcc-abbc”。

1 个答案:

答案 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.

这不是那么优雅(它有一些重复),但作为上一个问题的下一步仍然应该很容易理解。

Working example at Regex Storm