代码之家  ›  专栏  ›  技术社区  ›  John Sheehan

regex提取URL的一部分

  •  3
  • John Sheehan  · 技术社区  · 15 年前

    我今晚很懒,不想搞清楚这个。我需要一个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在满足上述要求方面做得很好。如果这些是输入,所以您不能在regex中使用“archive”,该怎么办?

     http://codebetter.com/blogs/jeremy.miller/
     http://weblogs.asp.net/scottgu/
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   Chris Lutz    15 年前

    这就是你要找的吗?

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

    在这两种情况下,都会捕获“存档”之前的片段。根据Regex的口味,你需要避开 / 是为了工作。另一种选择是,如果您不想匹配 archive 部分,你可以使用先行,但我不喜欢先行,而且很容易匹配,只捕获你需要的部分(在我看来),所以如果你喜欢使用先行来验证下一部分是 档案文件 ,你可以自己写。

    编辑:当你更新你的问题时,我对你想要什么的想法变得越来越模糊。如果你想要一个新的正则表达式来匹配第二种情况,你只需从末尾取下合适的部分,同样 / 以前的条件:

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

    如果你特别想要文本 jeremy.miller scottgu ,无论它们在URL中出现在何处,但仅作为URL中的“单词”(即,不是 scottgu2 ,再试一次, / 警告:

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

    如果你想要这个领域的话,还有第三种选择 之后 域名, 除非 这个领域是“博客”,它会变得多毛,尤其是 / 警告:

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

    这将匹配域名,可选 blogs 字段,然后是所需的字段。这个 (?:) 语法是 非捕获 组,这意味着它就像普通的圆括号,但不会捕获值,所以捕获的唯一值就是您想要的值。 (?:) 可能会因您的特殊Regex口味而有所不同。我不知道您需要什么语言,但我主要使用Perl,所以如果您使用PCRE,这个regex应该可以做到。如果你用的是不同的东西,那就看看非捕捉组。

    真的。这是很多关于正则表达式的话题。我得闭嘴,马上发帖。

        2
  •  5
  •   RaYell    15 年前

    试试这个:

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