Javascript regexp:如何创建单个匹配组

时间:2015-07-01 16:45:59

标签: javascript regex browser operating-system

方案

我正在尝试从navigator.appVersion属性获取操作系统详细信息。

所以我尝试了regexp.exec()方法:

/\(([a-z0-9 \.]+)(?=;).*\)|\(([a-z0-9 \.]+)\)/i.exec(navigator.appVersion);

以下是不同浏览器的结果:

  • Opera,Safari,Chrome

    ["(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)", "Windows NT 6.1", undefined]

  • IE

    "[(Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; rv:11.0)"_"Windows NT 6.1",undefined]

  • 火狐

    ["(Windows)", undefined, "Windows"]

所以我对regexp定义非常满意,匹配组正确获取操作系统详细信息。但...

问题

  1. 为什么在输出数组中,匹配组在浏览器中的位置不同?

  2. 什么是' undefined'输出数组的元素?

1 个答案:

答案 0 :(得分:1)

undefined是不匹配的组。您只有一个交替,每个交替都有一个捕获组。

这是你的正则表达式。

   \(
   ( [a-z0-9 \.]+ )              # (1)
   (?= ; )
   .* 
   \)
|  
   \(
   ( [a-z0-9 \.]+ )              # (2)
   \)  

不确定您需要做什么,但您可以使用单个捕获组来处理这两个

 # /\(([a-z0-9 .]+)(?:(?=;).*)?\)/i

 \(
 ( [a-z0-9 .]+ )               # (1)
 (?:
      (?= ; )
      .* 
 )?
 \)