我使用正则表达式来测试链接:
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)
我该怎么办?
答案 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