命名和未命名的PCRE捕获组如何交互?

时间:2018-01-25 20:23:03

标签: regex pcre

如果正则表达式是例如^(?<object>[\-\w]+)/([\-\w]+)$,会将第二个捕获组调用为$2还是$1?换句话说,匿名捕获组是绝对的还是相对编号的?

2 个答案:

答案 0 :(得分:3)

使用$2引用第二个编号捕获组。请注意,我不会将其称为匿名,也许,“未命名”会更适合这里。

查看sample regex demo

enter image description here

请参阅PCRE docs

  

PCRE支持使用命名和编号的捕获括号。名称只是识别括号的另一种方法,它仍然可以获取数字。

答案 1 :(得分:2)

在PCRE中,捕获组按找到的顺序按顺序编号。

这是一个示例,其中组被注释,缩进和编号(与一些条件混合)。

     # ==============================
     # Variations of the same thing
     # ==============================

1    ( a )?
2    ( b )?
3    ( c )?
c    (?(1)
       |  
   c      (?(2)
            |  
      c        (?(3) | (*FAIL) )
          )
     )

     # ==============================

4    (
  5       ( a )?
  6       ( b )?
  7       ( c )?
4    )
c    (?(2)
       |  
   c      (?(3)
            |  
      c        (?(4) | (*FAIL) )
          )
     )

     # ==============================

8    (?<A> a )?
9    (?<B> b )?
10   (?<C> c )?
c    (?(<A>)
       |  
   c      (?(<B>)
            |  
      c        (?(<C>) | (*FAIL) )
          )
     )

     # ==============================

11   (?<M>
  12      (?<A> a )?
  13      (?<B> b )?
  14      (?<C> c )?
c         (?(<A>)
            |  
   c           (?(<B>)
                 |  
      c             (?(<C>) | (*FAIL) )
               )
          )
11   )

     # ==============================

分支重置稍微区别对待条件 在BR开始的下一个组号处,它按顺序编号 在每个分支的开头。
经过BR后,编号在分配的最大计数后开始1+ 来自一个分支。

示例:

     # Super Branch with Conditional's

1    ( a )                     # (1)
     (?|
          x
br 2      ( y )                     # (2)
          z
          (?|
   br 3        ( u )                     # (3)
      4        ( u )                     # (4)
c              (?(1)
      5             ( R )                     # (5)
                 |  (?|
      br 6               ( x )                     # (6)
                      |  
      br 6               ( x )                     # (6)
   c                     (?(2)
                              a
                           |  
         7                    ( b )                     # (7)
                         )
         8               ( c )                     # (8)
                    )
               )
      9        ( u )                     # (9)
      10       ( u )                     # (10)
            |  
   br 3        ( e )                     # (3)
      4        ( e )                     # (4)
      5        ( e )                     # (5)
            |  
   br 3        ( c )                     # (3)
          )
   11     ( K )                     # (11)
       |  
br 2      (                         # (2 start)
               p
     3         (                         # (3 start)
                    q
                    (?|
       br 4              ( M )                     # (4)
          5              ( M )                     # (5)
          6              ( M )                     # (6)
          7              ( M )                     # (7)
                         (?|
          br 8                ( T )                     # (8)
             9                ( T )                     # (9)
             10               ( T )                     # (10)
                           |  
          br 8                ( D )                     # (8)
             9                ( D )                     # (9)
                         )
          12             ( R )                     # (12)
          13             ( R )                     # (13)
                      |  
       br 4              ( B )                     # (4)
          5              ( B )                     # (5)
          6              ( B )                     # (6)
                      |  
       br 4              ( v )                     # (4)
                    )
     3         )                         # (3 end)
               r
   2      )                         # (2 end)
   14     ( o )                     # (14)
   15     ( i )                     # (15)
       |  
br 2      ( t )                     # (2)
          s
   3      ( w )                     # (3)
     )
16   ( Z )                     # (16)

Dot-Net计数附录

有两种计算Dot-Net捕获的选项。

  1. 计算名为捕获组
  2. 命名组最后
  3. 显然,如果没有1,你就不会得到2.

    示例:不计算命名组

    1    (                             # (1 start)
              (?'overall'
                   ^
                   (?= [^&] )
                   (?:
                        (?<scheme> [^:/?#]+ )
                        :
                   )?
                   (?:
                        //
      2                 ( )                           # (2)
                        (?<authority> [^/?#]* )
                   )?
                   (?<path> [^?#]* )
                   (?:
                        \?
                        (?<query> [^#]* )
                   )?
      3            ( )                           # (3)
                   (?:
                        \#
                        (?<fragment> .* )
                   )?
              )
    1    )                             # (1 end)
    

    示例:计算命名组

    1    (                             # (1 start)
      2       (?'overall'                   # (2 start)
                   ^
                   (?= [^&] )
                   (?:
        3               (?<scheme> [^:/?#]+ )         # (3)
                        :
                   )?
                   (?:
                        //
        4               ( )                           # (4)
        5               (?<authority> [^/?#]* )       # (5)
                   )?
        6          (?<path> [^?#]* )             # (6)
                   (?:
                        \?
        7               (?<query> [^#]* )             # (7)
                   )?
        8          ( )                           # (8)
                   (?:
                        \#
        9               (?<fragment> .* )             # (9)
                   )?
      2       )                             # (2 end)
    1    )                             # (1 end)
    

    示例:计算命名组,命名组最后

    1    (                             # (1 start)
      4       (?'overall'                   #_(4 start)         
                   ^
                   (?= [^&] )
                   (?:
        5               (?<scheme> [^:/?#]+ )         #_(5)         
                        :
                   )?
                   (?:
                        //
        2               ( )                           # (2)
        6               (?<authority> [^/?#]* )       #_(6)         
                   )?
        7          (?<path> [^?#]* )             #_(7)         
                   (?:
                        \?
        8               (?<query> [^#]* )             #_(8)         
                   )?
        3          ( )                           # (3)
                   (?:
                        \#
        9               (?<fragment> .* )             #_(9)         
                   )?
      4       )                             #_(4 end)         
    1    )                             # (1 end)