如何使用正则表达式验证捕获组中的最后一个字符

Mat*_*ira 5 javascript regex url

我想从 URL 中提取路径,并且我想使用正则表达式。

我正在使用这个正则表达式: ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\n\?\=?\#]+)

和一个副作用,最后一个/被捕获。

例如——

domain.com/home/ = domain.com/home/
domain.com/home?param=value = domain.com/home
Run Code Online (Sandbox Code Playgroud)

如何验证特定捕获组的最后一个字符不是/

注意- 我知道我可以用另一个正则表达式匹配来解决这个问题,但我认为它可以用一个来完成。

The*_*ird 5

一种方法是将 the 添加/到否定字符类以不匹配它,并且仅在其后跟除/空白字符或空白字符之外的任何字符时才匹配它。

^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?((?:[^:\n?=?#\/]+|\/(?=[^\s\/])[^:\n?=?#\/]*)*)
Run Code Online (Sandbox Code Playgroud)

最后一部分将匹配

  • (捕获组 1
    • (?: 非捕获组
      • [^:\n?=?#\/]+ 匹配除列出的任何字符,包括 /
      • | 或者
      • \/(?=[^\s\/])/直接后跟除 then/或空白字符以外的任何字符时匹配
      • [^:\n?=?#\/]* 匹配除所列之外的可选字符
    • )* 关闭非捕获组并重复 0+ 次以匹配多个 /
  • ) 关闭第 1 组

正则表达式演示


anu*_*ava 3

您可以使最后一场比赛成为非贪婪的,后跟可选的/. 然后确保后面有?or 结尾:

\n
^(?:https?:\\/\\/)?(?:[^@\\n]+@)?(?:www\\.)?([^:\\n?=\xd6\xbf#]+?)\\/?(?=\\?|$)\n
Run Code Online (Sandbox Code Playgroud)\n

正则表达式演示

\n

你的组 #1 将在最后一个位置之前停止一个位置,/假设 URL 以此结尾或者之后有一个查询字符串。

\n