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

Regex 将多个组分配给关键字的正则表达式,regex,regex-group,Regex,Regex Group,我正在尝试实现一个正则表达式,它能够将相同的关键字或关键字组合分配给一个或多个命名组 例如,我想匹配'aa'和'bb'或'cc',并将'aa'和'bb'分配给组,将'cc'分配给组 此外,我可以有一个类似“aa”和“bb”或“aa”的查询,我希望“aa”和“bb”在组中,同时“aa”在组中 编辑: Input Example : bb is nice but not without the missingaa Output : Does not Validate, Group<1>

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

例如,我想匹配'aa'和'bb'或'cc',并将'aa'和'bb'分配给组,将'cc'分配给组

此外,我可以有一个类似“aa”和“bb”或“aa”的查询,我希望“aa”和“bb”在组中,同时“aa”在组中

编辑:

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

-

-

我知道分组可能很复杂,但我希望在aa和bb存在的情况下,分组不为空


如何实现这种行为?

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

对不起,你是对的,需要修改一下。 但是,您必须强制查找第一个或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
      )
 )

你能举一个输入和期望输出的例子吗?问题是输入imo。第一组应该匹配什么?第二组什么时候匹配?您使用的引擎允许组名的第一个字符使用数字,,我使用的是.NET C 4.0/4.5,数字并不重要。我还可以使用特定字符串将信息存储在命名组中。我目前正在尝试使用反向引用,但没有成功。yetHello,感谢您的回复。事实上,我正在使用.NET,但我不认为我需要递归正则表达式。请你检查一下我提供的例子好吗?你能告诉我你是否找到了比这个更好的解决方案吗:?aa.*bb | bb.*aa |?cc,因为我想添加可能更多的成员,感谢第一组中的2位。此外,如果我这样做?aa.*bb | bb.*aa |?aa bb组上的aa将包含aa bb,但组中不会包含aa,这对我来说非常重要。谢谢您的编辑。这是工作的情况下,如aa-bb-cc很好。现在正则表达式的复杂性之一是,我可以有bb aa,因此它要求我对aa和bb都使用前缀?=这一事实。目前无法捕获bb aa。另外,通过将cc替换为aa?*\baa\b.*\bbb\b???.*\b?:aa\b,aa bb仅在中被捕获,而不是两者都被捕获。@user2465083-请参阅“Edit2”。应该不需要?=除非你想变得更花哨,否则可以使用类似aa.*bb | bb.*aa的替换。先试试简单的东西,得到一个工作模型。再次感谢你花这么多时间帮助我。很抱歉,您提供的正则表达式与我尝试的任何字符串aa bb、aa bb cc、cc…上的任何内容都不匹配。。。。我已经能够得到我期望的行为:?aabb |?bbaa |?aa和输入aabb aa,但是我无法用任何字符来分隔aa-bb。在本例中,有2个匹配项。第一个有?=aabb和?=空值和一秒,带?=空和?=aa
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
 # ^.*?(?:(?:(?<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 
       )
  )
 # ^.*?(?:(?:(?<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
      )
 )