为什么JavaScript正则表达式在我不告诉它的情况下捕获空白?
使用以下代码:为什么JavaScript正则表达式在我不告诉它的情况下捕获空白?,javascript,regex,whitespace,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,类似Gecko)chrome/38.0.2125.57 Mobile Safari/537.36”; var newf=firefox.replace(/.
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,类似Gecko)chrome/38.0.2125.57 Mobile Safari/537.36”;
var newf=firefox.replace(/.*(firefox | Chrome)\/([\d\.]*?)/,“$1$2”);
var newc=chrome.replace(/.*(Firefox浏览器)\/([\d\.]*?)/,“$1$2”);
console.log(newf);
console.log(newc);
我在控制台中看到:
Firefox 32.0
Chrome 38.0.2125.57 Mobile Safari/537.36
我只想获得
浏览器名称版本
。我做错了什么?您需要使用此正则表达式:
var newc = chrome.replace(/.*?(Firefox|Chrome)\/([\d\.]*).*/, "$1 $2");
//=> "Chrome 38.0.2125.57"
[\d\.]*?
[\d\.]*
之后添加*
,以删除版本之后的所有文本#您需要使用此正则表达式:
var newc = chrome.replace(/.*?(Firefox|Chrome)\/([\d\.]*).*/, "$1 $2");
//=> "Chrome 38.0.2125.57"
[\d\.]*?
[\d\.]*
之后添加*
,以删除版本之后的所有文本#您的正则表达式没有考虑最后的
移动Safari/537.36
;因为正则表达式忽略了最后一位,因为模式在Chrome/38.0.2125.57
匹配后完全成功
如果您将结束符字符($
)添加到您的模式中,那么它将失败,问题也将显而易见。在Javascript中,查找与正则表达式匹配的文本部分并替换它,而不是整个输入字符串
您可以在末尾添加
*
,对最后的字符进行“烧录”,使正则表达式与整行匹配,从而导致替换以删除这些位。这还需要通过删除[\d\.]*
之后的?
,使上一个匹配组非惰性
我还将在模式的开头/结尾添加^
和$
,以表示输入字符串的开头和结尾(这是一种很好的形式),还可以选择添加/gm
,这会告诉正则表达式匹配每一行(在您的情况下可能很有用),尽管这两种添加都不是必需的
/^.*?(Firefox|Chrome)\/([\d\.]*).*$/gm
您的正则表达式没有考虑最后的
移动Safari/537.36
;因为正则表达式忽略了最后一位,因为模式在Chrome/38.0.2125.57
匹配后完全成功
如果您将结束符字符($
)添加到您的模式中,那么它将失败,问题也将显而易见。在Javascript中,查找与正则表达式匹配的文本部分并替换它,而不是整个输入字符串
您可以在末尾添加
*
,对最后的字符进行“烧录”,使正则表达式与整行匹配,从而导致替换以删除这些位。这还需要通过删除[\d\.]*
之后的?
,使上一个匹配组非惰性
我还将在模式的开头/结尾添加^
和$
,以表示输入字符串的开头和结尾(这是一种很好的形式),还可以选择添加/gm
,这会告诉正则表达式匹配每一行(在您的情况下可能很有用),尽管这两种添加都不是必需的
/^.*?(Firefox|Chrome)\/([\d\.]*).*$/gm
它似乎工作正常。查看
Chrome
不工作的原因是它后面有文本,您在正则表达式中不匹配/替换。它似乎工作正常。查看Chrome
不工作的原因是它后面有文本,您在正则表达式中不匹配/替换。在所有这些编辑之后,这个正则表达式变得类似于我的回答:)@anubhava有趣的是,我看不到关于为什么replace()
在你的回答中会这样做的解释,你也没有解释为什么你的代码会工作,或者为什么它是他们问题的解决方案。当你提交你的答案时,我正在写这个答案。在所有这些编辑之后,这个正则表达式变得与我的答案相似:)@anubhava有趣的是,我看不到关于replace()
为什么会像你的答案那样做的解释,你也没有解释为什么你的代码可以工作,或者为什么它可以解决他们的问题。当你提交你的答案时,我正在写这个答案。