4

这是我到目前为止所得到的:

/(netscape)|(navigator)\/(\d+)(\.(\d+))?/.test(UserAgentString.toLowerCase()) ? ' netscape'+RegExp.$3+RegExp.$4 : ''

我在这里尝试做几件不同的事情。

(1)。我想匹配or ,它后面必须跟一个斜杠和一个或多个数字 netscapenavigator

(2)。它可以选择跟随这些数字,最多可以是以下之一:一个句点和一个或多个数字。

如果 (1) 不为真,则表达式应计算为空字符串。

表达式应该返回' netscape8'if UserAgentStringis Netscape/8or Navigator/8

表达式应该返回' netscape8.4'if UserAgentStringis Navigator/8.4.2

正则表达式不起作用。特别是(这是我测试的一个经过编辑的版本,它仍然不起作用):

// in Chrome this produces ["netscape", "netscape", undefined, undefined]
(/(netscape)|(navigator)\/(\d+)/.exec("Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.7.5) Gecko/20060912 Netscape/8.1.2".toLowerCase()))

为什么不8匹配?它应该出现在第三个条目还是第四个条目中?

有几件事我想弄清楚它们是否受支持。请注意我有 5 组捕获父组。组 #5\d+包含组 #4:\.(\d+)中。是否可以检索匹配的组?

另外,如果我指定这样的组会发生什么?/(\.\d+)*/这匹配任何数量的“点号”字符串连接在一起(如版本号)。这里RegExp.$1应该匹配什么?

4

3 回答 3

3

您的“或”表达式没有按照您的想法进行。

简化,你这样做:

(a)|(b)cde

哪个匹配abcde

在“或”表达式周围((a)|(b))cde加上括号:这将匹配acdeor bcde

我发现http://regexpal.com/是一个非常有用的工具,可以快速检查我的正则表达式语法。

于 2012-06-28T18:59:09.403 回答
1

正则表达式 (netscape|navigator)\/(\d+(?:\.\d+)?) 将返回 2 个组(如果找到匹配项):

  1. 网景或导航器
  2. 名字后面的数字

    var m = /(netscape|navigator)\/(\d+(?:\.\d+)?)/.exec(text); 
    if (m != null) { 
      var r = m[1] + m[2]; 
    }
    
于 2012-06-28T18:54:20.663 回答
0

(....) 创建一个组。该组内的所有内容都与该组的变量一起返回。

以下将匹配netscapeornavigator和版本的前两个数字,由句点分隔。

          $1                       $2
 |------------------|        |------------|
/(netscape|navigator)[^\/]*\/((\d+)\.(\d+))/

最终代码如下所示:

/(netscape|navigator)[^\/]*\/((\d+)\.(\d+))/.test(
     navigator.userAgent.toLowerCase()
) ? 'netscape'+RegExp.$2 : ''

哪个会给你

netscape5.0

看看这些很棒的 tuts(还有更多):

于 2012-06-28T19:13:40.493 回答