在正则表达式中捕获组

时间:2011-06-21 00:11:05

标签: javascript regex

我正在探索在Regex中捕获群组,我对它缺乏文档感到困惑。对于前者,任何人都可以告诉我两个正则表达式之间的区别:

/(?:madhur)?/

/(madhur)?/

据我所知,?第二个建议在字符串中匹配madhur零或一次。

第一个与第二个有什么不同?

3 个答案:

答案 0 :(得分:28)

第一个不存储捕获组,例如$1将为空。 ?:前缀使其成为非捕获组。这通常是为了更好的性能和反向引用的混乱。

在第二个示例中,捕获组中的字符将存储在反向引用$1中。

Further Reading

答案 1 :(得分:15)

这是最明显的例子:

"madhur".replace(/(madhur)?/, "$1 ahuja");   // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"

反序列表按顺序存储,以便第一次匹配可以使用$1调用,第二次匹配可以使用$2,等等。如果您捕获匹配项(即(...)而不是{{ 1}}),你可以使用这些,如果你不这样做,那就没什么特别了。作为另一个例子,请考虑以下事项:

(?:...)

答案 2 :(得分:5)

它根本不会影响匹配。

它告诉正则表达式引擎

  • 不要通过replace()方法存储要使用的群组内容($ 1,$ 2,...)
  • 不要在exec()方法和
  • 的返回数组中返回它
  • 不要将其视为反向引用(\ 1,\ 2等)