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

时间:2008-10-06 16:42:17

标签: regex

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

但不匹配这样的事情:

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

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

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

4 个答案:

答案 0 :(得分:107)

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

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


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

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)

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

答案 1 :(得分:54)

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

未提及的是您的尝试不起作用的原因:在字符类中$(以及^./ )没有特殊含义,因此[/$]匹配文字/或文字$,而不是终止正则表达式(/)或匹配行尾({1}} {1}})。

答案 2 :(得分:39)

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$

答案 3 :(得分:15)

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

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)

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