【问题标题】:How to match an express route using a positive integer regex?如何使用正整数正则表达式匹配快速路由?
【发布时间】:2015-10-11 15:25:16
【问题描述】:

这实际上应该是一个相当简单的问题,但由于某种原因我无法让它工作。

我正在使用 Node.js 和 Express 的路由器。我正在尝试捕获如下网址:

http://localhost:3000/items/2
http://localhost:3000/items/35

我有以下正则表达式。 '2' 路线有效,但 '35' 无效,我不知道为什么。

router.get('/items/:id([0-9])', function(req, res){
    console.log("I work for /items/2");
});

router.get('/items/:id(^[0-9]*$)', function(req, res){
    console.log("I don't work at all :(");
});

当我针对https://regex101.com/#javascript 进行测试时,第二条路由的正则表达式工作得很好。我还尝试了正则表达式 ^\d+$,它适用于 regex101 但不适用于节点。

我是否遗漏了一些明显的东西?在我的 package.json 中使用 "express": "^4.13.3"。

** 更新**

我使用这篇文章中的正则表达式的答案使其工作:Regular Expression in Node.js Express Router

router.get('/items/:id(\\d+)', function(req, res) {
    console.log('I work!');
});

但是,即使我添加了一个额外的 '\' 来制作 '^\\d+$',路线仍然没有捕捉到 '25'。

** 更新**

看起来如果我去掉正则表达式锚“^”和“$”,路线就可以工作,但我不明白为什么会这样。

【问题讨论】:

  • 反对票有什么特别的原因吗?这似乎是一个非常详细的问题。
  • 整个路径字符串视为一个正则表达式,其中包含命名为:id 的括号分组。这就是为什么在括号内使用^ 不起作用(尽管$ 应该可以工作,但实际上它位于路径的末尾)。

标签: regex node.js express


【解决方案1】:

我不确定 Express Router 如何处理正则表达式,但一般来说,使用锚“^”告诉正则表达式它应该只匹配字符串的开头。所以^\\d+$ 将匹配35 但不匹配http://localhost:3000/items/35

如果你想要匹配以 id 结尾的路由,你应该使用\\d+$。 '$' 表示 id 后面不能有其他内容。

【讨论】:

  • 是的,去掉^就可以了。我可以离开$,一切似乎都很好。
猜你喜欢
  • 2016-01-15
  • 2018-08-29
  • 1970-01-01
  • 2019-02-24
  • 2013-10-22
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多