我正在尝试提出一个正则表达式,它将优雅地匹配域名之后的URL中的所有内容,以及第一个?,最后一个斜杠或URL结尾之前的所有内容,如果两者都不存在的话。
这是我提出的,但在某些情况下似乎失败了:
regex = /[http|https]:\/\/.+?\/(.+)[?|\/|]$/
总结:
http://nytimes.com/2013/07/31/a-new-health-care-approach-dont-hide-the-price/应该返回 2013/07/31 / A-新健康保健的方法-不要隐藏最价
http://nytimes.com/2013/07/31/a-new-health-care-approach-dont-hide-the-price?id=2应该返回 2013/07/31 / A-新健康保健的方法-不要隐藏最价
http://nytimes.com/2013/07/31/a-new-health-care-approach-dont-hide-the-price应该返回 2013/07/31 / A-新健康保健的方法-不要隐藏最价
答案 0 :(得分:8)
请不要使用正则表达式。使用URI库:
require 'uri'
str_you_want = URI("http://nytimes.com/2013/07/31/a-new-health-care-approach-dont-hide-the-price").path
查看关于this着名问题的所有内容,以便对这些事情为何不好的问题进行深入讨论。
此外,这个XKCD真的说明了原因:
简而言之,正则表达式是一个非常强大的工具,但当你处理那些由百页翻译标准制成的东西时,已经有一个库可以更快,更容易,并且更正确的是,为什么重新发明这个轮子?
答案 1 :(得分:4)
如果允许前瞻
((2[0-9][0-9][0-9].*)(?=\?\w+)|(2[0-9][0-9][0-9].*)(?=/\s+)|(2[0-9][0-9][0-9].*).*\w)
复制+粘贴在http://regexpal.com/
中请参阅此处使用ruby regex tester:http://rubular.com/r/uoLLvTwkaz
使用javascript正则表达式的图像,但它的工作方式相同
(?=)
只是一个先行
我基本上设置了从2XXX到(在顺序中)的三场比赛:
(?=\?\w+) # lookahead for a question mark followed by one or more word characters
(?=/\s+) # lookahead for a slash followed by one or more whitespace characters
.*\w # match up to the last word character
我很确定不需要一些括号,但我只是复制粘贴。
|
表达式中基本上有两个OR (A|B|C)
表达式。该订单很重要,因为它类似于(ifthen|elseif|else)
类型的交易。
你可以修改前缀,我只是假设你想要2XXX,其中X是一个匹配的数字。
另外,保存每个人的干草叉,正则表达式并不总是最好的,但是当你需要它时它就在那里。
此外,还有xkcd(https://xkcd.com/208/)用于所有内容: