正则表达式提取部分网址

时间:2009-08-27 06:30:34

标签: regex

今晚我很懒,不想弄清楚这个。我需要一个正则表达式来匹配来自以下输入的'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/

2 个答案:

答案 0 :(得分:7)

这会是你想要的吗?

'/([^/]+)/archive/'

在两种情况下都会在“存档”之前捕捉作品。根据正则表达式的风格,您需要转义/才能使其正常工作。作为替代方案,如果你不想匹配archive部分,你可以使用前瞻,但我不喜欢前瞻,并且它更容易匹配很多,只是捕获你需要的部分(在我的意见),所以如果你想使用前瞻来验证下一部分是archive,你可以自己写一个。

编辑:当你更新你的问题时,我对你想要的东西的想法变得模糊不清。如果你想要一个新的正则表达式来匹配第二种情况,你可以使用与以前相同的/条件来摘下相应的部分:

'/([^/]+)/$'

如果您特别想要文字jeremy.millerscottgu,无论它们出现在网址中的哪个位置,只能作为网址中的“字词”(即不是scottgu2),试试这个,再次使用/警告:

'/(jeremy\.miller|scottgu)/'

作为第三种选择,如果你想要之后的域名,除非那个字段是“博客”,它就会变得毛茸茸,特别是/警告:

'http://[^/]+/(?:blogs/)?([^/]+)/'

这将匹配域名,可选的blogs字段,然后匹配所需的字段。 (?:)语法是非捕获组,这意味着它就像常规括号,但不会捕获值,因此捕获的唯一值是您想要的值。 (?:)根据您的特定正则表达风格而有变化的风险。我不知道你要求的是什么语言,但我主要使用Perl,所以如果你使用PCRE,那么这个正则表达式应该很多。如果您使用不同的东西,请查看非捕获组。

哇。这是很多关于正则表达式的讨论。我需要闭嘴发帖。

答案 1 :(得分:5)

试试这个:

/\/([\w\.]+)\/archive/