在正则表达式中捕获组

Mad*_*uja 27 javascript regex

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

/(?:madhur)?/
Run Code Online (Sandbox Code Playgroud)

/(madhur)?/
Run Code Online (Sandbox Code Playgroud)

按照我的意见,?在第二个建议madhur在字符串中匹配零或一次.

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

ale*_*lex 29

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

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

进一步阅读.

  • 原因是对整个文本应用条件.并没有那两个不一样.第1个是madhur是第二个可选的r是可选的. (3认同)

bry*_*mck 15

这是最明显的例子:

"madhur".replace(/(madhur)?/, "$1 ahuja");   // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
Run Code Online (Sandbox Code Playgroud)

反向引用按顺序存储,以便可以调用第一个匹配$1,第二$2个匹配,等等.如果您捕获匹配(即(...)代替(?:...)),您可以使用这些,如果不这样,则没有什么特别之处.作为另一个例子,请考虑以下事项:

/(mad)hur/.exec("madhur");   // returns an array ["madhur", "mad"]
/(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
Run Code Online (Sandbox Code Playgroud)


And*_*eKR 5

它根本不影响匹配.

它告诉正则表达式引擎

  • 不要通过该replace()方法存储要使用的组内容(如$ 1,$ 2,...)
  • 不向的返回的数组中返回它exec()的方法和
  • 不要把它算作反向引用(\ 1,\ 2等)