UserAgent regex进入无限循环
我正在尝试为更多“标准”用户代理字符串创建正则表达式。到目前为止我有UserAgent regex进入无限循环,regex,Regex,我正在尝试为更多“标准”用户代理字符串创建正则表达式。到目前为止我有 ^(\w+)\/([\d+\.]+)+\s\((.+)+ 这让我看到了产品/系统信息的右括号。问题是,一旦我添加了\),我将它放入的每个正则表达式引擎都会阻塞(我想)并进入无限循环。这里有没有我看不到的循环?我想你想要更像这样的循环: (\w+)\/([\d.]+)\s*(?:\(([^)]+)\))? 当你使用嵌套的量词,比如([\d+\.]+)++,你的大部分表现都被扼杀了,我认为你这样做主要是因为不知道你在使用什么
^(\w+)\/([\d+\.]+)+\s\((.+)+
这让我看到了产品/系统信息的右括号。问题是,一旦我添加了
\)
,我将它放入的每个正则表达式引擎都会阻塞(我想)并进入无限循环。这里有没有我看不到的循环?我想你想要更像这样的循环:
(\w+)\/([\d.]+)\s*(?:\(([^)]+)\))?
当你使用嵌套的量词,比如
([\d+\.]+)++
,你的大部分表现都被扼杀了,我认为你这样做主要是因为不知道你在使用什么。这个扩展的解释应该有助于:
( (?# start capture group #1)
\w+ (?# match 1+ word characters)
) (?# end capture group)
\/ (?# match / literally)
( (?# start capture group #2)
[\d.]+ (?# match 1+ digit or . characters)
) (?# end capture group)
\s* (?# match optional whitespace)
(?: (?# start non-capturing group)
\( (?# match ( literally)
( (?# start capture group #3)
[^)]+ (?# match 1+ non-) characters)
) (?# end capture group)
\) (?# match ) literally)
)? (?# end optional non-capturing group)
这部分基于您的表达式和我的UA字符串:
Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/34.0.1847.92 Safari/537.36
正如您所看到的,您可以使用
\w+
(第一组),然后是/
,然后是[\d.]+
(第二组,
在字符类中没有特殊意义,不需要转义),然后是空格,然后是括号中的可选数据集(第三组)。([\d+.]+)+
您想在这里做什么?这里是(.+)+
?一般来说,像(.+)+
这样的嵌套量词是正则表达式中最大的性能问题,因为引擎有很多方法可以将字符串与该模式匹配,它需要做很多回溯。据我所知,除非有无穷大的输入,否则正则表达式不能循环无穷大。您有我们可以使用的示例输入吗?@H2Oooooooo,([\d+\.]+)+
背后的思想是匹配任何版本字符串,如1.1.1
,但点之间的位数可以任意匹配。回想起来,另一个,(.+)+\
)是一个非常可悲的尝试,它试图说“一个)
之前的任何长度的字符串”。你刚刚完成了我希望用大约一半的字符完成的任务。谢谢你的详细解释。没问题,我相信我的手机只是说我有一条评论,问为什么\s*
而不是\s+
。我的理由是,在(我认为)我们不需要“严格”的领域,它使它更加“灵活”。如果某个随机浏览器出于某种原因返回Mozilla/5.0(X11)
,该怎么办?我仍然认为这是一个UA字符串。