当我不告诉它时,为什么JavaScript正则表达式会捕获空白?

时间:2014-09-18 21:04:01

标签: javascript regex whitespace

使用以下代码:

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。我做错了什么?

2 个答案:

答案 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"
  1. 不要使用[\d\.]*
  2. [\d\.]*?懒惰
  3. .*之后添加[\d\.]*以删除版本#
  4. 之后的所有文字