【发布时间】:2016-02-01 23:32:19
【问题描述】:
我正在尝试构建一个正则表达式,它将匹配数字 (0-9)、字母字符和连字符的任意组合,但不是纯数字,用于路由。我能给出的最简单的例子如下..
router.param('slug', function(req, res, next, slug){
req.slug = slug;
next();
}
router.get(':slug((?=[a-zA-Z-])[a-zA-Z-\d]+)', function(req, res){
res.send(req.slug);
}
正则表达式背后的逻辑已经在 regex101.com 测试过
(?=[a-zA-Z-])[a-zA-Z-\\d]+
这个想法是积极的前瞻,以匹配 a-z、A-Z 或 - 中的至少一个,然后匹配 a-z、A-Z、0-9 的任意组合。
除非它在快递中不起作用。它将匹配“h”、“h-”、“h-9”,但不匹配“9-”或“9a”。此外,param 调用中的 slug 参数在匹配时为空。我难住了。我怀疑这可能是正则表达式字符串的一些转义问题?
这是对 param 调用的文档的参考。 http://expressjs.com/en/api.html#router.param
任何帮助表示赞赏。
更新:我认为这与正则表达式中没有捕获组有关..
另一个更新:以下正则表达式有一个捕获组,在 regex101.com 上工作,但没有与 express 相关的骰子......我在这里错过了什么?
(\\d*[a-zA-Z-][a-zA-Z-\\d]*$)+
第三次更新:express 正在调用这个库 https://github.com/pillarjs/path-to-regexp,这有助于指出我应该转义反斜杠。我已经编辑了帖子以反映这一点。图书馆本身正在转向这个
(\\d*[a-zA-Z-][a-zA-Z-\\d]*$)+
进入这个..
^\/(?:((\d(.*)[a-zA-Z-][a-zA-Z-\d](.*)$))+)\/?$
谢谢
【问题讨论】:
-
:slug(?=[a-zA-Z-])[a-zA-Z-\d]+无法匹配:slug9-,因为您告诉引擎将:slug之后的字母或连字符与(?=[a-zA-Z-])匹配。:slug[a-zA-Z-0-9]+将匹配以上所有值。 -
这就是我发布对文档的引用的原因。 router.param 参数的格式为 ':paramname(regex)'。正则表达式放在括号中,并在 router.param 调用中被转换为 paramname