使用以下代码:
var firefox = "Mozilla/5.0 (Android; Mobile; rv:32.0) Gecko/32.0 Firefox/32.0";
var chrome = "Mozilla/5.0 (Linux; Android 4.4.4; Nexus 4 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.57 Mobile Safari/537.36";
var newf = firefox.replace(/.*?(Firefox|Chrome)\/([\d\.]*?)/, "$1 $2");
var newc = chrome.replace(/.*?(Firefox|Chrome)\/([\d\.]*?)/, "$1 $2");
console.log(newf);
console.log(newc);
我在控制台中得到了这个:
Firefox 32.0
Chrome 38.0.2125.57 Mobile Safari/537.36
我只想获得browser_name version
。我做错了什么?
答案 0 :(得分:4)
你的正则表达式没有考虑到最后Mobile Safari/537.36
;作为vks pointed out正则表达式忽略了最后一点,因为在Chrome/38.0.2125.57
匹配后你的模式完全成功。
如果你在你的模式中添加了终结符字符($
),那么它就会失败并且问题会很明显。 Javascript中的replace()
找到与正则表达式匹配的文本部分并替换它,而不是整个输入字符串。
您最后可以添加.*
来排序'刻录'到那些最后的字符,从而导致正则表达式匹配整行,从而导致替换以删除这些位。这也要求您在?
之后删除[\d\.]*
,以使之前的匹配组不会延迟。
我还会在模式的开头/结尾添加^
和$
来表示输入字符串的开头和结尾(这样做很好),还可以选择添加/gm
,告诉正则表达式匹配每一行(在您的情况下可能有用),但这些添加都不是必需的。
/^.*?(Firefox|Chrome)\/([\d\.]*).*$/gm
答案 1 :(得分:3)
您需要使用此正则表达式:
var newc = chrome.replace(/.*?(Firefox|Chrome)\/([\d\.]*).*/, "$1 $2");
//=> "Chrome 38.0.2125.57"
[\d\.]*
[\d\.]*?
懒惰
.*
之后添加[\d\.]*
以删除版本#