正则表达式不匹配字符串中超过一个的尾部斜杠

Regex to not match more than one trailing slash in string

正在寻找不匹配超过 1 次尾部斜线的正则表达式

api/v1
/api/v1
/api/2v1/21/
/api/blah/v1/
/api/ether/v1//
/api/23v1///

预期匹配

/api/v1
/api/2v1/21/
/api/blah/v1/

我尝试了什么:

^\/([^?&#\s]*)(^[\/{2,}\s])$

您可以使用

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

参见regex demo

详情

  • ^ - 字符串开头
  • (?:/[^/?&#\s]+)* - / 字符的零次或多次重复,后跟一个或多个非 /?&# 和空格
  • /? - 一个可选的 /
  • $ - 字符串结尾。

通过使用负数lookahead:

^(?!.*//)/.*

See this demo at regex101

在您尝试的模式中,模式的第二部分无法匹配,它断言字符串的开头 ^ 然后匹配一个 单个 字符在字符 class (^[\/{2,}\s])$ 后面紧跟断言字符串的结尾。

^\/([^?&#\s]*)(^[\/{2,}\s])$

              ^^^^^^^^^^^^^^

但是你已经在这里声明了字符串的开头^\/

您可以重复以 / 开头的模式,然后重复 1 次以上您已有的字符 class:

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

说明

  • ^ 字符串开头
  • (?:\/[^\/?&#\s]+)+ 重复 1+ 次 / 和 1+ 个字符而不是列出的
  • \/? 可选 /
  • $ 字符串结束

看到一个regex demo