【问题标题】:Regex for route matching in ExpressExpress中路由匹配的正则表达式
【发布时间】:2012-06-07 03:37:13
【问题描述】:

我不太擅长正则表达式,所以我想确保我做得正确。假设我有两条非常相似的路线,/discussion/:slug//page/:slug/。我想创建一个匹配这两个页面的路由。

app.get('/[discussion|page]/:slug', function(req, res, next) {
  ...enter code here...
})

这是正确的方法吗?现在我只是创建了两条单独的路线。

someFunction = function(req, res, next) {..}
app.get('/discussion/:slug', someFunction)
app.get('/page/:slug', someFunction)

【问题讨论】:

  • 你对[]括号有信心吗?那将是我第一次看到它们以这种方式使用。 (Parens () 在更多工具中更常见——我只是不知道你的具体工具。)
  • 哎呀,错字了。但我正在尝试查找 express 的示例,但我找不到任何示例(或者我不知道要搜索的术语)。
  • 只需将'someFunction'设为完全相同的功能,这样更容易做到,也许你已经这样做了
  • 在这种情况下 app.get(['/discussion/:slug', /page/:slug'], function(req, res, next) { ...在此处输入代码.. . }) 也是一种选择。

标签: regex node.js express


【解决方案1】:

app.get('/:type(discussion|page)/:id', ...) 有效

【讨论】:

  • 我认为这样做的关键是您可以将请求参数分配给正则表达式,方法是将其放在参数名称 IE 后面的“()”中::type(<regex>) 将设置 req.params.type 为匹配的字符串你不能把正则表达式放在变量之前。
  • 这个语法看起来不错,但似乎根本没有在expressjs.com/en/guide/routing.html 记录:-(
  • @rjmunro 它记录在 Express 使用的 path-to-regexp 模块中。 (这在 Express 文档中有所提及,但是,是的,这很容易被忽视。)请参阅 github.com/pillarjs/path-to-regexp
  • 谢谢,它对我有用。然而,case sensitive 似乎默认设置为false。我可以将其设置为 true 吗?这似乎是官方文档path-to-regexp
【解决方案2】:

您应该使用文字 javascript 正则表达式对象,而不是字符串,并且 @sarnold 是正确的,您希望使用括号进行替换。方括号用于字符类。

const express = require("express");
const app = express.createServer();
app.get(/^\/(discussion|page)\/(.+)/, function (req, res, next) {
  res.write(req.params[0]); //This has "discussion" or "page"
  res.write(req.params[1]); //This has the slug
  res.end();
});

app.listen(9060);

(.+) 表示必须存在至少 1 个字符的 slug,否则此路由将不匹配。如果您希望它也匹配空 slug,请使用 (.*)

【讨论】:

  • 有没有办法在没有正则表达式和字符串的情况下使用它?我更喜欢关键字参数而不是列表。
  • AFAIK 如果您需要正则表达式的复杂匹配能力,则无法使用带有命名参数的字符串。 TJ 在 express 文档中对此进行了说明。我相信这最终是 javascript 正则表达式对象的限制。
  • 你可以这样做app.get(new RegExp('(your|string)\/here'), function…
  • 您的正则表达式未锚定在网址的开头。是否明确表达锚定或正则表达式应该是 /\/(discussion|pa...
  • 它应该是/^\/(discussion|page)\/(.+)/,正如上面用户所建议的那样。我提出了修改建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多