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

时间:2015-03-31 14:47:39

标签: regex express

我试图理解express.js的内部管道,但我在一件事上遇到了一些麻烦。

如果添加新路线,请执行以下操作:

app.get("/hello/darkness/myold/:name", ...)

我在内部提供的字符串成为正则表达式。现在,我想出了我认为正则表达式应该是内部的,我想出了:

^\/hello\/darkness\/myold\/([^\/]+?)\/?$

([^\/]+?)将捕获name参数,如果禁用严格路由,则会出现\/?,并且整个事件都封装在^...$中。然而,当我去看看实际存储在express中的内容时,实际上是这样的:

^\/hello\/darkness\/myold\/(?:([^\/]+?))\/?$

如您所见,捕获组周围有一个非捕获组。我的问题是:这个非捕获组的目的是什么?


我用来查看regex express.js内部使用的方法只是制作一个无效的正则表达式并查看错误控制台:

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

产量

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

1 个答案:

答案 0 :(得分:0)

这个问题的答案是非捕获组是参数是可选的情况的遗留物。考虑以下两条路线之间的区别:

/hello/:world/goodbye

/hello/:world?/goodbye

他们将分别生成:

^\/hello\/(?:([^\/]+?))\/goodbye\/?$

^\/hello(?:\/([^\/]+?))?\/goodbye\/?$

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