正则表达式提取URL的一部分

3

今晚我有点懒,不想自己琢磨这个。我需要一个正则表达式来匹配以下输入中的'jeremy.miller'和'scottgu':

http://codebetter.com/blogs/jeremy.miller/archive/2009/08/26/talking-about-storyteller-and-executable-requirements-on-elegant-code.aspx

http://weblogs.asp.net/scottgu/archive/2009/08/25/clean-web-config-files-vs-2010-and-net-4-0-series.aspx

有什么想法?

编辑

Chris Lutz在满足上述要求方面做得非常好。如果以下是输入内容,那么您不能在正则表达式中使用“archive”,该怎么办?

 http://codebetter.com/blogs/jeremy.miller/
 http://weblogs.asp.net/scottgu/

如果有人想看这个问题的结果,请访问:http://managedassembly.com/New(在codebetter.com、weblogs.asp.net、devlicio.us、lostechnies.com等网站上查找帖子)。 - John Sheehan
2个回答

7
这是你要找的吗?
'/([^/]+)/archive/'

在这两种情况下,捕获“archive”之前的片段。根据正则表达式的不同风格,您需要转义/才能使其起作用。或者,如果您不想匹配archive部分,您可以使用前瞻,但我不喜欢前瞻,而且更容易匹配大量内容并只捕获您需要的部分(在我看来),所以如果您喜欢使用前瞻来验证下一个部分是否为archive,您可以自己编写一个。
编辑:随着您更新问题,我对您想要的内容的想法变得模糊了。如果您想要一个新的正则表达式来匹配第二个案例,您可以像以前一样从结尾取出适当的部分,并具有相同的/条件:
'/([^/]+)/$'

如果您想要特定的文本jeremy.millerscottgu,无论它们在URL中出现的位置如何,但只作为URL中的“单词”(即不包含scottgu2),请尝试以下内容,再次注意/限制:
'/(jeremy\.miller|scottgu)/'

作为第三种选择,如果您想要在域名后面添加字段,除非该字段是 "blogs",否则情况会变得棘手,特别是带有 "/" 的情况:
'http://[^/]+/(?:blogs/)?([^/]+)/'

这将匹配域名,一个可选的blogs字段,然后是所需的字段。 (?:)语法是一个非捕获组,这意味着它就像普通括号一样,但不会捕获值,因此只捕获您想要的值。 (?:)在特定的正则表达式风格下有变化的风险。我不知道你要求的语言是什么,但我主要使用Perl,所以如果你使用PCRE,这个正则表达式应该基本上可以胜任。如果你使用的是其他语言,请了解非捕获组。
哇,这谈论了很多关于正则表达式的内容。我需要闭嘴并发布了。

比我的好,回答更快,解释得很好。点个赞(也谢谢你的代码块评论)。 - drAlberT
到目前为止工作正常。编辑我的问题并添加了一个我没有考虑到的额外情况。 - John Sheehan
谢谢。你让我找对了方向。我动态创建了模式,注入了主机名(我已经提取出来了),然后可选地匹配/blogs/。最终结果是:{0}/(blogs/)*([^/]+)/,其中{0}将被主机名替换。感谢你的努力,你节省了我很多时间,并支持我的懒惰,我非常感激 :) - John Sheehan
程序员的三个主要美德是:懒惰、急躁和傲慢。- Larry Wall. - Chris Lutz

5
尝试这个:
/\/([\w\.]+)\/archive/

靠,你比我快了几秒钟。+1 - Chris Lutz
它是有效的。如果您正在使用该工具,则只需删除第一个和最后一个“/”。我在这里使用PERL符号来标记正则表达式的开头和结尾。 - RaYell
RaYell - 什么是PERL?我知道Perl是一种编程语言,而perl是该语言的解释器,但我不熟悉PERL。 - Chris Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接