这是我到目前为止所得到的:
/(netscape)|(navigator)\/(\d+)(\.(\d+))?/.test(UserAgentString.toLowerCase()) ? ' netscape'+RegExp.$3+RegExp.$4 : ''
我在这里尝试做几件不同的事情。
(1)。我想匹配 netscape
或navigator
,并且必须后跟一个斜杠和一个或多个数字。
(2)。它可以选择跟随这些数字,最多包含一个句点:一个句点和一个或多个数字。
如果(1)不为真,表达式应该计算为空字符串。
如果' netscape8'
为UserAgentString
或Netscape/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
应该在这里匹配?
答案 0 :(得分:3)
你的“或”表达不符合你的想法。
简化,你这样做:
(a)|(b)cde
哪个匹配a
或bcde
。
在您的“或”表达式周围加上括号:((a)|(b))cde
,这将与acde
或bcde
匹配。
我发现http://regexpal.com/是一个非常有用的工具,可以快速检查我的正则表达式语法。
答案 1 :(得分:1)
正则表达式 (netscape|navigator)\/(\d+(?:\.\d+)?)
将返回2个组(如果找到匹配项):
名称后面的数字
var m = /(netscape|navigator)\/(\d+(?:\.\d+)?)/.exec(text);
if (m != null) {
var r = m[1] + m[2];
}
答案 2 :(得分:0)
(....)
创建一个组。该组内的所有内容都与该组的变量一起返回。
以下内容将匹配netscape
或navigator
以及以句点分隔的版本的前两个数字。
$1 $2
|------------------| |------------|
/(netscape|navigator)[^\/]*\/((\d+)\.(\d+))/
最终代码如下:
/(netscape|navigator)[^\/]*\/((\d+)\.(\d+))/.test(
navigator.userAgent.toLowerCase()
) ? 'netscape'+RegExp.$2 : ''
哪个会给你
netscape5.0
查看这些伟大的内容(还有更多):