正则表达式中的空组

时间:2016-03-21 20:07:27

标签: regex

我使用正则表达式来测试链接:

lolspec:\/\/(spectator\.(na|euw1|eu|kr|oc1|br|la1|la2|ru|tr|pbe1)\.lol\.riotgames\.com:(80|8088)((([?&]region=(NA1|EUW1|EUN1|KR|OC1|BR1|LA1|LA2|RU|TR1|PBE1))|([?&]gameID=([0-9]+))|([?&]encKey=(.+)))){3})

测试此链接:

lolspec://spectator.euw1.lol.riotgames.com:80?region=NA1&gameID=44584&encKey=fghgdsv1134+ianfcuia

但有些群体是空的(#7,#8,#9)

我该怎么办?

1 个答案:

答案 0 :(得分:0)

捕获组可能过度杀伤。

您在那里使用的正则表达式包含一个量化的容器捕获组4 像这样( ... ){3}

这样做会覆盖容器捕获缓冲区3次 捕获组中捕获的最后一个值。

前进到下一个级别是外部组封装的单个内部组,如此(( ... )){3},因此不需要,并且您获得与覆盖相同的影响。

移动得更深,三个捕获组都被交替分开 他们遵循相同的规则,如果他们可以匹配,每个规则将被覆盖 在每个连续的1..3量化过程中再次进行。

只有一组在交替集群中匹配 因此,如果您有相同的相邻数据,则可以使用相同的数据进行匹配 交替群集,将其他群集组留空。

因此,如果您想匹配无序参数,这不是方法 在一个字符串中。

如果您使用的话,这样做的方法是使用前瞻断言 OR 一个可以做条件的引擎。

使用条件的方法是这样的

 (?:
      .*? 
      (?:
           ( (?(1)(?!)) abc )           # (1)
        |  ( (?(2)(?!)) def )           # (2)
        |  ( (?(3)(?!)) ghi )           # (3)
      )
 ){3}

强制查找所有捕获组内容 你这样做的方式是一样的,但没有条件,
并承受上述后果。

顺便说一句,上面的正则表达式没有任何带有特定样本的组,但它有很多问题。

 lolspec:\/\/
 (                             # (1 start)
      spectator\.
      ( na | euw1 | eu | kr | oc1 | br | la1 | la2 | ru | tr | pbe1 )  # (2)
      \.lol\.riotgames\.com:
      ( 80 | 8088 )                 # (3)
      (                             # (4 start)
           (                             # (5 start)
                (                             # (6 start)
                     [?&] region=
                     ( NA1 | EUW1 | EUN1 | KR | OC1 | BR1 | LA1 | LA2 | RU | TR1 | PBE1 )  # (7)
                )                             # (6 end)
             |  (                             # (8 start)
                     [?&] gameID=
                     ( [0-9]+ )                    # (9)
                )                             # (8 end)
             |  (                             # (10 start)
                     [?&] encKey=
                     ( .+ )                        # (11)
                )                             # (10 end)
           )                             # (5 end)
      ){3}                          # (4 end)
 )                             # (1 end)

输出

 **  Grp 0 -  ( pos 0 , len 97 ) 
lolspec://spectator.euw1.lol.riotgames.com:80?region=NA1&gameID=44584&encKey=fghgdsv1134+ianfcuia  
 **  Grp 1 -  ( pos 10 , len 87 ) 
spectator.euw1.lol.riotgames.com:80?region=NA1&gameID=44584&encKey=fghgdsv1134+ianfcuia  
 **  Grp 2 -  ( pos 20 , len 4 ) 
euw1  
 **  Grp 3 -  ( pos 43 , len 2 ) 
80  
 **  Grp 4 -  ( pos 69 , len 28 ) 
&encKey=fghgdsv1134+ianfcuia  
 **  Grp 5 -  ( pos 69 , len 28 ) 
&encKey=fghgdsv1134+ianfcuia  
 **  Grp 6 -  ( pos 45 , len 11 ) 
?region=NA1  
 **  Grp 7 -  ( pos 53 , len 3 ) 
NA1  
 **  Grp 8 -  ( pos 56 , len 13 ) 
&gameID=44584  
 **  Grp 9 -  ( pos 64 , len 5 ) 
44584  
 **  Grp 10 -  ( pos 69 , len 28 ) 
&encKey=fghgdsv1134+ianfcuia  
 **  Grp 11 -  ( pos 77 , len 20 ) 
fghgdsv1134+ianfcuia