【问题标题】:Where did this second match come from?这第二场比赛是从哪里来的?
【发布时间】:2012-05-17 02:09:42
【问题描述】:

我有这段代码,当我删除global 标志时,它匹配一个额外的fox:

var str = "...brown #fox jumped...";

var arr1 = str.match(/#([^\s]+)/g); //["#fox"]
var arr2 = str.match(/#([^\s]+)/); //["#fox", "fox"]

console.log(arr1.join(", ")); //#fox
console.log(arr2.join(", ")); //#fox, fox

(source of code)

demo

我不知道发生了什么,欢迎任何启发我的东西

【问题讨论】:

    标签: javascript regex string-matching


    【解决方案1】:

    第一项是匹配整个正则表达式的字符串。接下来的所有项目都是大括号内匹配的对应值(...)

    PS:[^\s]可以写成[\S]

    【讨论】:

    • 可能值得一提的是,match 在使用(不)g 标志时表现不同:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
    • @Andrew Whitaker:如果有解释就值得了。我找不到任何官方解释,但从我的角度来看这是显而易见的
    • 我不确定这是否能完全解释为什么会发生这种情况(或者至少我错过了),PS:我 +1 是因为你的 PS
    【解决方案2】:

    第二个fox 实际上并不匹配。这是一个捕获的组。默认情况下,括号构成一个捕获组。因此,在您的示例中,fox 是括号内的匹配项,而 #fox 是整个匹配项。

    要编写没有捕获组的正则表达式,请执行以下操作:

    #\S+
    

    您还可以使用以下语法指定非捕获组:

    #(?:\S+)
    

    全局标志阻止捕获组捕获,因为如果设置了全局标志,字符串匹配函数不会获取捕获的组。 Regex exec 函数将获取捕获组,如this question and answer 中所述。

    【讨论】:

    • 但是为什么只添加了没有全局标志的组,我看不出做较少检查的东西是如何返回多个带有全局标志的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2022-11-23
    • 2022-01-08
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多