1

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

例如,我想匹配('aa' AND 'bb') OR 'cc'并将 'aa' AND 'bb' 分配给 group<1> 并将 'cc' 分配给 group<2>。

我也可以有一个像('aa' AND 'bb') OR 'aa'这样的查询,我希望 'aa' AND 'bb' 在 group<1> 中,同时 'aa' 在 group< 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<1> 如果存在 aa 和 bb 则不为空。

我怎样才能实现这种行为?

4

1 回答 1

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
      )
 )
于 2013-09-10T15:46:42.220 回答