Javascript正则表达式:交替和嵌套

时间:2012-06-28 18:43:21

标签: javascript regex

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

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

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

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

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

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

如果' netscape8'UserAgentStringNetscape/8,则表达式应返回Navigator/8

如果' netscape8.4'UserAgentString,则表达式应返回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组捕获paren组。组#5 \d+包含在组#4中的\.(\d+)。是否可以检索匹配的组?

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

3 个答案:

答案 0 :(得分:3)

你的“或”表达不符合你的想法。

简化,你这样做:

(a)|(b)cde

哪个匹配abcde

在您的“或”表达式周围加上括号:((a)|(b))cde,这将与acdebcde匹配。

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

答案 1 :(得分:1)

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

  1. netscape或navigator
  2. 名称后面的数字

    var m = /(netscape|navigator)\/(\d+(?:\.\d+)?)/.exec(text); 
    if (m != null) { 
      var r = m[1] + m[2]; 
    }
    

答案 2 :(得分:0)

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

以下内容将匹配netscapenavigator以及以句点分隔的版本的前两个数字。

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

最终代码如下:

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

哪个会给你

netscape5.0

查看这些伟大的内容(还有更多):