【问题标题】:Regex to match string that does not contain slash正则表达式匹配不包含斜杠的字符串
【发布时间】:2021-11-13 09:24:52
【问题描述】:

我正在尝试在 Web 应用程序中使用 vue-router 设置路由,并使用正则表达式匹配模式。我要匹配的模式是任何包含字母数字字符(和下划线)但不带斜杠的字符串。以下是一些示例(第一个斜杠只是显示域之后的字符串,例如 example.com/):

/codestack
/demo45
/i_am_long

应该匹配的字符串是:

/data/files.xml
/share/home.html
/demo45/photos

到目前为止,我想出的唯一正则表达式是:

path: '/:Username([a-zA-Z0-9]+)'

这不太对,因为它匹配除斜线之外的所有字符。而我只想在遇到第一个正斜杠之前匹配第一组字母数字字符(包括下划线)。

如果路由包含正斜杠,例如/data/files.xml 那么这应该是一个不同的正则表达式路由匹配。因此,我需要一个正则表达式模式来匹配上面包含斜杠的示例。理论上,它们可以包含任意数量的斜线,例如/demo45/photos/holiday/2015/bahamas.

【问题讨论】:

标签: regex express vue-router


【解决方案1】:

对于第一部分,您可以匹配 1 个或多个单词字符,这些字符也将匹配下划线。

锚点^$ 断言字符串的开始和结束。

^\w+$

对于第二个,你可以用单词字符开始匹配,后跟/

如果有更多正斜杠,您可以选择重复组中的第一个模式。

模式后面的最后一部分可以是 1 个或多个单词字符,可选部分匹配点和单词字符。

^\w+/(?:\w+/)*\w+(?:\.\w+)?$

Regex demo

如果你想匹配除/ 之外的任何字符,你可以使用[^/]

^(?:[^/\s]+/)+[^/\s]+$

Regex demo

【讨论】:

  • 虽然这测试很好并且有道理,但出于某种原因 vue-router 不喜欢它。如果我使用path: '/:Username([a-zA-Z0-9]+)' 的路线,那么/demo45 上的匹配就会发生。如果我使用您的正则表达式并尝试 path: '/:Username(^\w+$)' 我会收到 [Vue Router warn]: No match found for location with path "/demo45" 的错误
  • 可以在这里测试:forbeslindesay.github.io/express-route-tester/:Username(^\w+$) 放在Route 字段中,然后将/demo45 放在Path 字段中
  • 刚刚通过删除开头的^ 使其工作。所以应该是/:Username(\w+$)
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多