用于Express中路由匹配的正则表达式


75

我对正则表达式不太满意,因此我想确保自己正确执行了此操作。假设我有两条非常相似的路线,/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)

4
您对[]替代括号有信心吗?这是我第一次看到它们以这种方式使用。(家长()在更多工具中更常见-我只是不知道您使用的具体工具。)
sarnold 2012年

1
哎呀,错字。但我正在尝试寻找快递的示例,但找不到任何示例(或者我不知道要搜索的术语)。
乔纳森·翁

只需将“ someFunction”设为完全相同的函数,这是更容易做到的方式,也许您已经做到了
Alexander Mills

在这种情况下,app.get(['/ discussion /:slug',/ page /:slug'],function(req,res,next){...在这里输入代码...})也可以选择。
最多

Answers:


119

app.get('/:type(discussion|page)/:id', ...) 作品


7
我认为这很关键,您可以将请求参数分配给正则表达式,方法是将其放在参数名称IE之后的“()”中: :type(<regex>)将设置 req.params.type为匹配的字符串您不能将正则表达式放在变量之前。
duality

2
这种语法看起来不错,但似乎完全没有在expressjs.com/en/guide/routing.html上进行记录:-(
rjmunro

7
@rjmunro它记录在path-to-regexpExpress使用的模块中。(这在Express文档中有所提及,但是,是的,很容易忽略。)请参见github.com/pillarjs/path-to-regexp
broofa

谢谢,对我有用。但是,它似乎默认case sensitive设置为false。我可以将其设置为true吗?这似乎是正式文档的正则表达式路径
bcjohn

67

您应该使用文字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个字符的子弹,否则此路由将不匹配。使用(.*),如果你希望它匹配空蛞蝓,以及。


有没有办法在不使用正则表达式和字符串的情况下使用它?我更喜欢使用关键字参数而不是列表。
乔纳森·翁

1
AFAIK如果您需要正则表达式的复杂匹配功能,则无法使用带有命名参数的字符串。TJ在快速文档中对此做了一些说明。我相信这最终是javascript正则表达式对象的限制。
彼得·里昂斯

3
您可以做到这一点app.get(new RegExp('(your|string)\/here'), function…
Misha Reyzlin,2012年

5
您的正则表达式未锚定在网址的开头。是否明确表示锚点或正则表达式应为/ \ /(discussion | pa ...
user239558

1
它应该/^\/(discussion|page)\/(.+)/如上述用户所建议。我建议进行修改。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.