在斜杠或第一个问号之前匹配所有内容的正则表达式?

时间:2013-08-02 02:25:44

标签: ruby regex

我正在尝试提出一个正则表达式,它将优雅地匹配域名之后的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-新健康保健的方法-不要隐藏最价

2 个答案:

答案 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真的说明了原因: Yep.

简而言之,正则表达式是一个非常强大的工具,但当你处理那些由百页翻译标准制成的东西时,已经有一个库可以更快,更容易,并且更正确的是,为什么重新发明这个轮子?

答案 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正则表达式的图像,但它的工作方式相同

enter image description here

(?=)只是一个先行

我基本上设置了从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/)用于所有内容:

https://xkcd.com/208/