Javascript 正则表达式:如何创建单个匹配组

Javascript regexp: how to create a single matching group

场景

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

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

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

下面是在不同浏览器中的结果:

所以我对正则表达式定义非常满意,匹配组正确获取了 OS 详细信息。但是...

问题

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

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

未定义的是不匹配的组。您有一个交替,每个交替都有一个捕获组。

这是您的正则表达式的详细信息。

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

不确定你需要做什么,但你可以使用一个捕获组来处理这两个问题

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

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