我有一个URL,我正在尝试将它与正则表达式匹配以取出一些组。我遇到的问题是,网址可以或继续使用“/”和更多网址文字。我想匹配这样的网址:
但不匹配这样的事情:
所以,我认为最好的选择是这样的:
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]
其中最后的字符类包含“/”或行尾。尽管如此,角色类似乎对“$”并不满意。如何在仍然撤回正确的组的同时最好地区分这些URL?
答案 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
,这意味着字符串结束。)