nodejs request.url.match(regexp)似乎除了匹配之外还返回匹配的一个子string
我试过这样一段代码
var match = req.url.match(/^\/user\/(.+)/)
并传递一个像这样的"___http://someurl/user/jane"
事实certificate,匹配被初始化为一个具有以下元素的数组
match[0]='/user/jane' match[1]='jane'
我会期待一个单一的元素,即match[0]
的第一个元素。 为什么第二个string返回 – 它似乎不匹配正则expression式。
我对JavaScript的使用经验很less,有些四处寻找后我找不到解释。 欣赏这个解释
谢谢
看一下String.match
,或者更好的RegExp.exec
,它的返回值与String.match
相同,但是不带g
标志的正则expression式:
返回的数组具有匹配的文本作为第一个项目,然后匹配的每个捕获括号中的一个项目包含捕获的文本。
也就是说,圆括号¹之间的组成一个俘获组。 如果你只需要完整的匹配,你可以使用:
var match = req.url.match(/^\/user\/.+/)[0]; console.log(match); //logs: "/user/jane"
这将提取整个匹配(在索引0
),将其返回到variablesmatch
,数组的其余部分将被丢弃。
注:如果正则expression式可能不匹配,则应在抽取完整匹配之前testing它是否返回匹配以防止出现错误:
var match = req.url.match(/^\/user\/.+/); if (match !== null) { match = match[0]; console.log(match); //"/user/jane" } else { console.log("no match"); }
这里有一个现场演示: jsFiddle
我已经移除了捕获组,因为在这种情况下它不会有所作为。 实际上并不重要,只是一个微观优化。
你可以在这里阅读更多关于正则expression式的捕获组/反向引用。
¹不总是这样,有修饰符使它成为一个非捕获组( ?:
:),向前看,向后看等,但这些都是无关紧要的。 你可以在上面链接的网站上find更多关于这些的信息。
- 节点js express.compiler错误
- 为什么当我同时发送50000多个查询时,我的node.js应用程序会“挂起”?
- 使用Visual Studio代码debugging节点js
- 有没有办法用restify来logging控制台中的每个请求?
- 节点expressJwt除非指定id路由
- MEAN Stack – 仅在某些REST方法上使用带有express-restify-mongoose的jwt
- 未定义的req.session和req.session.user_id不起作用
- 通过Sequelize(Express / NodeJS)访问MySQL时出错
- 在Express.js中,我将如何编写一个路由/正则expression式来捕获所有美国州?