正则表达式将多个组分配给关键字

时间:2013-09-10 15:08:57

标签: regex regex-group

我正在尝试实现一个能够为一个或多个命名组分配相同关键字或关键字组合的正则表达式。

例如,我希望匹配('aa'和'bb')或'cc'并将'aa'和'bb'分配给组< 1>和'cc'分组< 2>。

此外,我可以查询('aa'和'bb')或'aa',我希望'aa'和'bb'在组< 1>中同时'aa'属于组< 2>。

// Works to get 'aa' everywhere but cannot find a way to add 'bb' to the group<1>
(?=(?:\s+|^)(?<1>aa)(?:\s+|$)) 

编辑:

Input Example : bb is nice but not without the missingaa
Output : Does not Validate, Group<1> is null | Group<2> is null

-

Input Example : bb is nice as well as aa
Output : Validate, Group<1> : bb is nice as well as aa | Group<2> is null

-

Input Example : bb is nice but not without the missingaa or cc
Output : Validate, Group<1> is null | Group<2> is cc

-

Input Example : bb is nice as well as aa or cc
Output : Validate, Group<1> is bb is nice as well as aa | Group<2> is cc

我知道分组可能很复杂,但我希望Group&lt; 1&gt;如果aa和bb存在,则不为null。

我该如何实现这种行为?

1 个答案:

答案 0 :(得分:0)

作为参考,对于大多数正则表达式引擎,组匹配不会像数组一样累积。 Dot-Net是一个例外,它可以做到这一点(集合)。

道歉,你是对的,需要轮换 但是,你必须强制找到第一个OR c。这是通过条件前瞻来完成的。 祝你好运!

 # ^.*?(?:(?:(?<grp1>(?:\baa\b.*?\bbb\b|\bbb\b.*?\baa\b))(?(?=.*\b(?:cc|aa)\b).*(?<grp2>(?:\bcc\b|\baa\b))|))|(?<grp2>\b(?:cc|aa)\b))

  ^ 
  .*? 
  (?:
       (?:                           # Force find   a AND b, OR c
            (?<grp1>
                 (?:
                      \b aa \b .*? \b bb \b 
                   |  \b bb \b .*? \b aa \b 
                 )
            )
            (?(?=                  # conditional assertion, force to find 
                 .*
                 \b (?:  cc | aa  ) \b 
              )
                 .* 
                 (?<grp2>
                      \b (?:  cc | aa  ) \b
                 )
              |  
            )
       )
    |  
       (?<grp2>              # Else, forcc find   OR c
            \b (?:  cc | aa  ) \b 
       )
  )

编辑:这将匹配(aa cc),(bb)
但要注意,排列越多,越复杂。这导致了断言,旗帜,条件的发展,所有这些都会降低性能并使维护变得更加困难。

 # ^.*?(?:(?:(?<grp1>(?:\baa\b(?:(?!cc).)*?\bbb\b|\baa\b(?:(?!bb).)*?\bcc\b|\bbb\b(?:(?!cc).)*?\baa\b|\bbb\b(?:(?!aa).)*?\bcc\b))(?(?=.*\b(?:aa|bb|cc)\b).*(?<grp2>\b(?:aa|bb|cc)\b)|))|(?<grp2>\b(?:cc|aa)\b))

 ^ 
 .*? 
 (?:
      # Force find:   (aa bb), (cc)
      #               (aa cc), (bb)
      #               (bb aa), (cc)
      #               (bb cc), (aa)
      (?:
           (?<grp1>                                     # GROUP1 
                (?:
                     \b aa \b (?:(?!cc).)*? \b bb \b 
                   |
                     \b aa \b (?:(?!bb).)*? \b cc \b 
                   |
                     \b bb \b (?:(?!cc).)*? \b aa \b 
                   |
                     \b bb \b (?:(?!aa).)*? \b cc \b 
                )
           )

           (?(?=      # Conditional assertion, find   (aa), (bb), (cc) 
                .*
                \b (?:  aa | bb | cc ) \b 
             )
                # The condition is true, so consume it
                .* 
                (?<grp2>                                # GROUP2
                     \b (?:  aa | bb | cc ) \b
                )
             |  # The condition is false, match nothing  
           )

      )
   | 
      # Or, 
      # Force find:   (), (aa)
      #               (), (bb)
      #               (), (cc)

      (?<grp2>                      # GROUP2 
           \b (?:  aa | bb | cc ) \b
      )
 )