【发布时间】:2011-09-19 03:00:31
【问题描述】:
我正在探索在 Regex 中捕获组,但我对缺少文档感到困惑。例如,谁能告诉我两个正则表达式之间的区别:
/(?:madhur)?/
和
/(madhur)?/
在我看来,? in second 建议在字符串中匹配madhur 零或一次。
第一个和第二个有什么不同?
【问题讨论】:
标签: javascript regex
我正在探索在 Regex 中捕获组,但我对缺少文档感到困惑。例如,谁能告诉我两个正则表达式之间的区别:
/(?:madhur)?/
和
/(madhur)?/
在我看来,? in second 建议在字符串中匹配madhur 零或一次。
第一个和第二个有什么不同?
【问题讨论】:
标签: javascript regex
第一个不会存储捕获组,例如$1 将为空。 ?: 前缀使其成为非捕获组。这样做通常是为了获得更好的性能和避免反向引用的混乱。
在第二个示例中,捕获组中的字符将存储在反向引用$1中。
【讨论】:
" , ".match(/(\s+)?,(\s+)?/) 产生 [","," "," "],而 " , ".match(/(\s+)?,(\s+)?/g) 或 " , ".match(/[\s+]?,[\s+]?/) 产生 [","]。你能解释一下为什么
g 会更改与match() 匹配的返回方式(如果您有捕获组)。
完全不影响匹配。
它告诉正则表达式引擎
replace() 方法使用(如$1、$2、...)exec()方法的返回数组中返回,并且【讨论】:
/(foo)\1/ 将匹配"foofoo",但/(?:foo)\1/ 不会。 \1 在第一个中被解释为反向引用,在第二个中被解释为八进制转义序列。
" , ".match(/(\s+)?,(\s+)?/)和" , ".match(/[\s+]?,[\s+]?/)它们输出不同的数组。
这是最明显的例子:
"madhur".replace(/(madhur)?/, "$1 ahuja"); // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
反向引用按顺序存储,以便可以使用$1 调用第一个匹配项,使用$2 调用第二个匹配项等。如果您捕获匹配项(即(...) 而不是(?:...)),您可以使用这些,如果你不这样做,那就没什么特别的了。作为另一个示例,请考虑以下内容:
/(mad)hur/.exec("madhur"); // returns an array ["madhur", "mad"]
/(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
【讨论】: