Javascript 第二场比赛是从哪里来的?
我有这样一个代码,当我删除Javascript 第二场比赛是从哪里来的?,javascript,regex,string-matching,Javascript,Regex,String Matching,我有这样一个代码,当我删除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,
g
lobal标志时,它匹配一个额外的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
我不知道发生了什么,任何能启发我的东西都是受欢迎的第一项是匹配整个正则表达式的字符串。接下来的所有项目都是大括号中匹配项的对应值
(…)
PS:
[^\s]
可以写成[\s]
第一项是匹配整个正则表达式的字符串。接下来的所有项目都是大括号中匹配项的对应值(…)
PS:
[^\s]
可以写成[\s]
第二个fox
实际上并不匹配。这是一个被俘虏的群体。默认情况下,括号构成捕获组。因此,在您的示例中,fox
是括号内的匹配项,而#fox
是整个匹配项
要在不使用捕获组的情况下写入正则表达式,请执行以下操作:
#\S+
您还可以使用以下语法指定非捕获组:
#(?:\S+)
全局标志阻止捕获组捕获,因为如果设置了全局标志,字符串匹配函数不会获取捕获的组。Regex exec函数将获取捕获组,如中所述。第二个
fox
实际上并不匹配。这是一个被俘虏的群体。默认情况下,括号构成捕获组。因此,在您的示例中,fox
是括号内的匹配项,而#fox
是整个匹配项
要在不使用捕获组的情况下写入正则表达式,请执行以下操作:
#\S+
您还可以使用以下语法指定非捕获组:
#(?:\S+)
全局标志阻止捕获组捕获,因为如果设置了全局标志,字符串匹配函数不会获取捕获的组。Regex exec函数将获取捕获组,如中所述。可能值得一提的是,
match
在(未)使用g
标志时表现不同:@Andrew Whitaker:如果有解释就值得了。我找不到任何官方解释,但从我的角度来看,这是显而易见的。我不确定这是否完全解释了为什么会发生这种情况(或者至少我没有看到),PS:I+1,因为您的PSP可能值得一提的是,match
在g
标记为(非)时的行为不同使用:@Andrew Whitaker:如果有解释就值得了。我找不到任何官方解释,但从我的角度来看,这是显而易见的。我不确定这是否完全解释了为什么会发生这种情况(或者至少我不知道),PS:I+1是因为你的PSA,但为什么只添加了没有全球标志的组,我看不出检查次数少的东西如何返回多个全局falg,但为什么只添加了没有全局标志的组,我看不出检查次数少的东西如何返回多个全局falg