我有一个URL,我正在尝试将它与正则表达式匹配以拉出一些组.我遇到的问题是URL可以结束或继续使用"/"和更多URL文本.我想匹配这样的网址:
HTTP://服务器/ XYZ/2008-10-08-4
HTTP://服务器/ XYZ/2008-10-08-4 /
HTTP://服务器/ XYZ/2008-10-08-4/123 /更
但不匹配这样的东西:
HTTP://服务器/ XYZ/2008-10-08-4-1
所以,我认为我最好的选择是这样的:
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]
最后的字符类包含"/"或行尾.尽管如此,角色类似乎对"$"并不满意.如何在仍然撤回正确的组的同时最好地区分这些URL?
要匹配内容的任何一个/或结尾,请使用 (/|\z)
这仅适用于您不使用多行匹配的情况(即您匹配单个URL,而不是换行符分隔的URL列表).
把它与你所拥有的更新版本放在一起:
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)
请注意,我已经将开头更改为非空格(\S+?
)的非贪婪匹配,而不是匹配任何内容和所有内容(.*
)
你现在有几个正则表达式可以做你想做的事情,所以这已经足够了.
一直没有什么提的是,为什么你的企图将无法正常工作:在字符类,$
(以及^
,.
和/
)没有特殊的意义,所以[/$]
比赛无论是文字/
或文字$
,而不是终止正则表达式(/
)或匹配行尾($
).
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
在Ruby和Bash中,您可以$
在括号内使用.
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)
(这个解决方案类似于Pete Boughton,但保留了使用$
,这意味着行尾,而不是使用\z
,这意味着字符串的结尾.)