0

我有这段代码,当我删除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

(代码来源)

演示

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

4

2 回答 2

4

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

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

于 2012-05-17T02:11:33.243 回答
2

第二个fox实际上并不匹配。这是一个捕获的组。默认情况下,括号构成一个捕获组。所以在你的例子中,fox括号内匹配的是什么,而#fox整个匹配是。

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

#\S+

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

#(?:\S+)

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

于 2012-05-17T02:20:22.413 回答