我正在尝试构建一个正则表达式,它将匹配任何数字组合(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上工作,但没有快递骰子......我在这里缺少什么?
(\\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](.*)$))+)\/?$
由于
答案 0 :(得分:0)
这应该这样做:
charset
匹配
(?!\d+$)[a-zA-Z-\d]+
foo-123
123-bar
不匹配:
foobar