Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript正则表达式在我不告诉它的情况下捕获空白?_Javascript_Regex_Whitespace - Fatal编程技术网

为什么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()
    为什么会像你的答案那样做的解释,你也没有解释为什么你的代码可以工作,或者为什么它可以解决他们的问题。当你提交你的答案时,我正在写这个答案。