Regex 这个非捕获组的目的是什么?

Regex 这个非捕获组的目的是什么?,regex,express,Regex,Express,我试图理解的内部管道,但我有一个小麻烦的一件事 如果添加新路线,例如: app.get("/hello/darkness/myold/:name", ...) 我在内部提供的字符串成为正则表达式。现在,我算出了我认为正则表达式内部应该是什么,我想到了: ^\/hello\/darkness\/myold\/([^\/]+?)\/?$ [^\/]+?将捕获名称参数\/?如果禁用严格路由,则存在,并且整个内容封装在^…$中。然而,当我去查看express中实际存储的内容时,实际上是这样的: ^\

我试图理解的内部管道,但我有一个小麻烦的一件事

如果添加新路线,例如:

app.get("/hello/darkness/myold/:name", ...)
我在内部提供的字符串成为正则表达式。现在,我算出了我认为正则表达式内部应该是什么,我想到了:

^\/hello\/darkness\/myold\/([^\/]+?)\/?$
[^\/]+?将捕获名称参数\/?如果禁用严格路由,则存在,并且整个内容封装在^…$中。然而,当我去查看express中实际存储的内容时,实际上是这样的:

^\/hello\/darkness\/myold\/(?:([^\/]+?))\/?$
如您所见,捕获组周围有一个非捕获组。我的问题是:这个非俘虏组织的目的是什么

我用来查看regex express.js内部使用的方法只是生成一个无效的regex并查看错误控制台:

app.get('/hello/darkness/myold/:friend/[', function(req, res){});
屈服

SyntaxError: Invalid regular expression: ^\/hello\/darkness\/myold\/(?:([^\/]+?))\/[\/?$

这个问题的答案是,非捕获组是参数是可选的情况的遗留。考虑以下两条路线的差异:

/你好/世界/再见

/你好/:世界?/再见

它们将分别产生:

^\/你好\/?:[^\/]+?\/再见\/$

^\/你好?:\/[^\/]+??\/再见\/$


请注意,当存在可选参数时,非捕获组会发生重要但微妙的变化。

您可以删除它,在这种情况下它没有任何用处。有人在编码时兴奋不已。发生在我们最好的人身上。