Regex 节点,Express 4-用于路由的正则表达式。字母或字母数字,包括连字符,但不完全是数字

Regex 节点,Express 4-用于路由的正则表达式。字母或字母数字,包括连字符,但不完全是数字,regex,node.js,express,Regex,Node.js,Express,我正在尝试构建一个正则表达式,它将匹配数字(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); }

我正在尝试构建一个正则表达式,它将匹配数字(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]+
这个想法是一个积极的前瞻,至少匹配a-z、a-z或-,然后匹配a-z、a-z、0-9的任意组合

但它在express中不起作用。它将匹配“h”、“h-”和“h-9”,但不匹配“9-”或“9a”。此外,param调用中的slug参数在匹配时为空。我被难住了。我怀疑这可能是正则表达式字符串的转义问题

以下是参数调用的文档参考。

谢谢你的帮助

更新:我认为这与正则表达式中没有捕获组有关

另一个更新:下面的正则表达式有一个捕获组,在regex101.com上工作,但没有使用express的骰子…我在这里缺少什么

(\\d*[a-zA-Z-][a-zA-Z-\\d]*$)+
第三个更新:express正在调用这个库,这有助于指出我应该避免反斜杠。我编辑了这篇文章来反映这一点。图书馆本身正在扭转这一局面

(\\d*[a-zA-Z-][a-zA-Z-\\d]*$)+
进入这个

^\/(?:((\d(.*)[a-zA-Z-][a-zA-Z-\d](.*)$))+)\/?$
谢谢

这应该可以做到:

(?!\d+$)[a-zA-Z-\d]+

匹配项:

foo-123
123条
foobar

不匹配:


123456

:slug(?=[a-zA-Z-])[a-zA-Z-\d++
无法匹配
:slug9-
,因为您告诉引擎在
:slug
之后匹配字母或连字符(?=[a-zA-Z-])。将匹配您上面的所有值。这就是我发布文档引用的原因。router.param参数的格式为“:paramname(regex)”。正则表达式放在括号中,并在router.param调用中转换为paramname