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

Javascript Regular Expression: alternation and nesting

本文关键字:嵌套 正则表达式 Javascript      更新时间:2023-09-26

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

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

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

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

(2). 可以选择在这些数字后面跟最多一个:一个句点和一个或多个数字。

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

如果表达式Netscape/8Navigator/8,表达式应返回' netscape8' UserAgentString

如果表达式Navigator/8.4.2 UserAgentString则返回' netscape8.4'

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

// 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应该在这里匹配什么?

你的"or"表达并没有按照你的想法做。

简化,您正在这样做:

(a)|(b)cde

哪个匹配abcde.

在你的"or"表达式两边加上括号:((a)|(b))cde,这将匹配acdebcde

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

则表达式(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]; 
    }
    

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

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

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

最终代码如下所示:

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

这会给你

netscape5.0

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

  • http://perldoc.perl.org/perlrequick.html
  • http://perldoc.perl.org/perlre.html
  • http://perldoc.perl.org/perlretut.html