正则表达式匹配URL行尾或"/"字符

Chr*_*mer 72 regex

我有一个URL,我正在尝试将它与正则表达式匹配以拉出一些组.我遇到的问题是URL可以结束继续使用"/"和更多URL文本.我想匹配这样的网址:

但不匹配这样的东西:

所以,我认为我最好的选择是这样的:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]
Run Code Online (Sandbox Code Playgroud)

最后的字符类包含"/"或行尾.尽管如此,角色类似乎对"$"并不满意.如何在仍然撤回正确的组的同时最好地区分这些URL?

Pet*_*ton 110

要匹配内容的任何一个/或结尾,请使用 (/|\z)

这仅适用于您不使用多行匹配的情况(即您匹配单个URL,而不是换行符分隔的URL列表).


把它与你所拥有的更新版本放在一起:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)
Run Code Online (Sandbox Code Playgroud)

请注意,我已经将开头更改为非空格(\S+?)的非贪婪匹配,而不是匹配任何内容和所有内容(.*)

  • 我如何给你更多的观点;)谢谢你.只是文档(/ |\A)会匹配正斜杠或字符串的开头. (6认同)
  • 这在JavaScript中不起作用 (6认同)
  • 注意:JavaScript 不支持 `\Z` 和 `\z` (3认同)

Dav*_*man 57

你现在有几个正则表达式可以做你想做的事情,所以这已经足够了.

一直没有什么提的是,为什么你的企图将无法正常工作:在字符类,$(以及^,./)没有特殊的意义,所以[/$]比赛无论是文字/或文字$,而不是终止正则表达式(/)或匹配行尾($).

  • 这是经常被遗忘的事情,并且在正则表达式文档中没有提及. (7认同)
  • 请注意,^在字符类中可以具有特殊含义.如果它是类中的第一个字符,则使其成为负类,除了其他字符外,它将匹配任何内容.例如,为了匹配除a或b之外的任何东西,你可以使用[^ ab].要包含文字^,只需确保它不是第一个,因此要匹配a,b或^,您将使用[ab ^]. (4认同)

Ada*_*gen 36

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
Run Code Online (Sandbox Code Playgroud)

  • 这是因为对此背后的决策没有任何解释. (19认同)

Spa*_*awk 17

在Ruby和Bash中,您可以$在括号内使用.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)
Run Code Online (Sandbox Code Playgroud)

(这个解决方案类似于Pete Boughton,但保留了使用$,这意味着行尾,而不是使用\z,这意味着字符串的结尾.)

  • `$`在javascript中以这种方式工作,而`\ z`则不然(Chrome 48,Firefox 43,IE9). (3认同)
  • PHP也是我能说的.我认为没有理由在实际的任何实现中```不能在括号`()`中使用.括号`[]`使它成为文字. (2认同)