【问题标题】:What does the Express route param regex `(*)` mean?Express route param regex `(*)` 是什么意思?
【发布时间】:2023-03-18 11:55:01
【问题描述】:

我在 Perl 上大吃一惊。我对正则表达式很满意(但仍然容易出错)。

为什么(*) 在名为 param 的 Express 路由中用作正则表达式?

为什么(.*) 不能在名为 param 的 Express 路由中用作正则表达式?

([\\w:./]+) 这样的方法是不是更可靠?


我正在尝试使用旨在在值中包含斜杠的路由参数。

例如

如果请求是:

http://www.example.com/new/https://www.youtube.com/trending

...我正在使用这条路线:

app.get('/new/:url', (req, res) => {
  console.log('new')
  console.log(req.params.url)
})

我希望 url 等于 https://www.youtube.com/trending

我知道路径是在斜杠上分割的,所以我想我可以使用 a regular expression in parentheses after the named parameter 来匹配斜杠。

我试过/new/:url(.*),我认为greedily应该匹配任何东西,包括斜线,但这使得路由完全失败。为什么这不起作用?

通过我自己的反复试验,我发现/new/:url([\\w:./]+) 有效。这对我来说很有意义,但似乎不必要地复杂。这是“正确的方式”吗?

最让我困惑的是我发现in a YouTube video example... 为什么/new/:url(*) 有效? * 表示前一项的 0 个或多个,但星号之前没有任何内容。

我感觉答案就在this GitHub issue,但我并不清楚阅读该线程究竟发生了什么。 (*) 是否依赖于可能会在下一版 Express 中更正的错误?

【问题讨论】:

  • @Adam 我已经读过了,它要么没有回答我的问题,要么就是我不明白。如果您阅读我的问题,您会看到我引用了该 GitHub 问题。

标签: node.js regex express


【解决方案1】:

问题的第一部分由引用的GitHub issue回答。

至于为什么.*不起作用,点(.)在这个实现中并不是一个特殊字符。这只是一个点。

从引用的 GitHub 问题中,我了解到星号 (*) 根本不被理解为量词。它只是匹配一切。所以,这就是 (*) 起作用的原因。

GitHub 问题未解释的部分是.*,当考虑到已知错误时,它应该匹配单个字符,然后是其他所有字符。但是,通过反复试验,我确定 . 根本不是特殊字符。在这个实现中,它只是一个文字点。

例如,如果请求是:

http://www.example.com/new/https://www.youtube.com/trending

...我正在使用这条路线:

app.get('/new/:url(.*)', (req, res) => {
  console.log('new')
  console.log(req.params.url)
})

路由不会匹配,而是请求

http://www.example.com/new/.https://www.youtube.com/trending

将匹配(注意https 前面的点)并且req.params.url 将等于.https://www.youtube.com/trending

我使用以下代码进行测试:

const express = require('express')
const app = express()
const port = process.env.PORT || 3000

app.get('/dotStar/:dotStar(.*)', (request, response) => {
  console.log(`test request, dotStar: ${request.params.dotStar}`)
  response.send(`dotStar: ${request.params.dotStar}`)
})

app.get('/star/:star(*)', (request, response) => {
  console.log(`test request, star: ${request.params.star}`)
  response.send(`star: ${request.params.star}`)
})

app.get('/regexStar/:regexStar([a-z][a-z-]*)', (request, response) => {
  console.log(`test request, regexStar: ${request.params.regexStar}`)
  response.send(`regexStar: ${request.params.regexStar}`)
})

app.get('/dotDotPlus/:dotDotPlus(..+)', (request, response) => {
  console.log(`test request, dotDotPlus: ${request.params.regexStar}`)
  response.send(`dotDotPlus: ${request.params.dotDotPlus}`)
})

app.get('/regex/:regex([\\w:./-]+)', (request, response) => {
  console.log(`test request, regex: ${request.params.regex}`)
  response.send(`regex: ${request.params.regex}`)
})

app.listen(port, () => {
  console.log(`Listening on port ${port}...`)
})

-- 也见于this gist

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2012-08-15
    • 2012-08-29
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多