正则表达式:嵌套匹配组中的惰性匹配

时间:2016-09-06 17:21:38

标签: regex

我遇到以下正则表达式的问题:

I login with (CORRECT|INCORRECT (username|password|username and password)) credentials

基本上,我希望它匹配的是仅以下4个字符串(它确实如此):

  1. 我使用CORRECT凭据登录
  2. 我使用INCORRECT用户名凭据登录
  3. 我使用INCORRECT密码凭据登录
  4. 我使用INCORRECT用户名和密码凭据登录
  5. 但是,匹配组如下:

    1. 1:正确2:
    2. 1:INCORRECT用户名2:用户名
    3. 1:INCORRECT密码2:密码
    4. 1:INCORRECT用户名和密码2:用户名和密码
    5. 我希望匹配组如下:

      1. 1:CORRECT
      2. 1:INCORRECT 2:用户名
      3. 1:INCORRECT 2:密码
      4. 1:INCORRECT 2:用户名和密码

2 个答案:

答案 0 :(得分:1)

如果你可以使用支持Branch Reset的引擎,可以这样做

I login with (?|(CORRECT)()|(INCORRECT) (username(?: and password)?|password)) credentials

在分支重置组的每次轮换中,组编号重置

 I [ ] login [ ] with [ ] 
 (?|                           # Branch reset
      ( CORRECT )                   # (1)
      ( )                           # (2)
   |                              # or,
      ( INCORRECT )                 # (1)
      [ ] 
      (                             # (2 start)
           username 
           (?: [ ] and [ ] password )?
        |  
           password
      )                             # (2 end)
 )                             # End branch reset
 [ ] credentials

或者,如果分支重置不可用,请使用此

I login with (?:(CORRECT)|(INCORRECT) (username|password|username and password)) credentials

这样做是在单独的组中捕获正确/不正确,然后是 如果组2匹配,则组3有效 它仍然匹配完全相同的字符串。

 I[ ]login[ ]with[ ]
 (?:
      ( CORRECT )                   # (1)
   |  ( INCORRECT )                 # (2)
      [ ]
      ( username | password | username[ ]and[ ]password )  # (3)
 )
 [ ]credentials

答案 1 :(得分:0)

您不需要嵌套组,您可以将此正则表达式与固定的第一组和可选的第二组一起使用:

I login with ((?:IN)?CORRECT) (?:(username|password|username and password) )?credentials

RegEx Demo