[英]Node, Express 4 - Regex for routing. Alpha or Alphanumeric including hyphen but not purely numeric
我正在尝试构建一个正则表达式,以匹配数字(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);
}
regex背后的逻辑已在regex101.com上进行了测试
(?=[a-zA-Z-])[a-zA-Z-\\d]+
这个想法是一个积极的前瞻,可以匹配az,AZ或-中的至少一个,然后匹配az,AZ,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](.*)$))+)\/?$
谢谢
应该这样做:
(?!\\d+$)[a-zA-Z-\\d]+
火柴:
foo-123
123-bar
foobar
不匹配:
123456
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.