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字符串。