使用以下代码:
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 版本
。我做错了什么?
最佳答案
您的正则表达式没有考虑最后一个 Mobile Safari/537.36
;作为vks pointed out正则表达式忽略最后一位,因为您的模式在 Chrome/38.0.2125.57
匹配后完全成功。
如果您将结束字符 ($
) 添加到您的模式中,它就会失败并且问题会很明显。 replace()
在 Javascript 中查找与正则表达式匹配的文本部分并替换它,而不是整个输入字符串。
您可以在末尾添加 .*
以“燃烧”最后的字符,从而使正则表达式匹配整行 从而导致替换以删除这些位。这还要求您通过删除 [\d\.]*
之后的 ?
使之前的匹配组成为非惰性匹配组。
我还会在模式的开头/结尾添加 ^
和 $
以表示输入字符串的开头和结尾(这是一种很好的形式) ),以及可选地添加 /gm
,它告诉正则表达式匹配每一行(可能对您的情况有用),尽管这些添加都不是必需的。
/^.*?(Firefox|Chrome)\/([\d\.]*).*$/gm
关于javascript - 为什么 JavaScript 正则表达式在我没有告诉它时捕获空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25922292/