正则表达式的非捕获括号

隐约雷鸣
  • 617
var rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;
rquickExpr.exec('#one');// ["#one", undefined, "one", index: 0, input: "#one"]

这里为什么第一个元素是#one,不是用了非捕获括号了么?
如果我去掉这个非捕获括号,得到的结果完全一样啊,所以它有什么用?

var rquickExpr2 = /^\s*(<[\w\W]+>)[^>]*|#([\w-]*)$/;
rquickExpr2.exec('#one');// ["#one", undefined, "one", index: 0, input: "#one"]
回复
阅读 2.8k
3 个回答

正则exec()之后,返回的数组,第一个元素是你的整个匹配,也就是arr[0],arr[1]才是你第一个子式匹配的,从你结果看是undefined,没匹配到,而你的非捕获的也确实没有捕获,因为你用了三次括号,但是只返会了两个子式匹配。

匹配出来的数组,第一个元素,是你要匹配的那个字符串。在正则中是以圆括号为单元,?:就是不匹配当前单元

/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/

?:去掉,你就看出区别了
/^(\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/

你知道吗?

宣传栏