正则表达式将URL分解为多个部分

时间:2011-04-04 16:53:39

标签: regex

我刚刚开始学习正则表达式,所以我还不确定这个问题的几个方面。

现在,我的网页读入URL将其分解为多个部分,仅使用某些部分进行处理: 例如。 1)http://mycontoso.com/products/luggage/selloBag 例如。 2)http://mycontoso.com/products/luggage/selloBag.sf404.aspx

出于某种原因,Sitefinity给了我们两种可能性,这很好,但我需要的只是实际的产品细节,如“行李箱/ selloBag”

我当前的正则表达式是:"(.*)(map-search)(\/)(.*)(\.sf404\.aspx)",我将它与替换语句结合起来并提取组4(或$ 4)的内容,这很好,但它不适用于示例2。

所以问题是:是否有可能将2种可能性与正则表达式匹配,其中字符串的一部分可能存在或可能不存在,然后仍然引用您实际想要使用其值的组?

3 个答案:

答案 0 :(得分:4)

RFC-3986是关于URI的权限。 Appendix B提供了这个正则表达式,将其分解为其组件:

re_3986 = r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
# Where:
# scheme    = $2
# authority = $4
# path      = $5
# query     = $7
# fragment  = $9

这是一个使用命名捕获组的增强(和注释)正则表达式(在Python语法中):

    re_3986_enhanced = re.compile(r"""
        # Parse and capture RFC-3986 Generic URI components.
        ^                                    # anchor to beginning of string
        (?:  (?P<scheme>    [^:/?#\s]+): )?  # capture optional scheme
        (?://(?P<authority>  [^/?#\s]*)  )?  # capture optional authority
             (?P<path>        [^?#\s]*)      # capture required path
        (?:\?(?P<query>        [^#\s]*)  )?  # capture optional query
        (?:\#(?P<fragment>      [^\s]*)  )?  # capture optional fragment
        $                                    # anchor to end of string
        """, re.MULTILINE | re.VERBOSE)

有关根据RFC-3986挑选和验证URI的更多信息,您可能需要查看我一直在处理的文章:Regular Expression URI Validation

答案 1 :(得分:0)

取决于你的正则表达式实现,但大多数支持像

这样的语法
(\.sf404\.aspx|)

假设你的组4(即零索引组)。 |列出了两个备选方案,其中一个是空字符串。

答案 2 :(得分:0)

你没有说你是否在javascript中这样做,但如果你这样做,Steven Levithan写的parseUri lib在解析网址方面做得非常好。您可以从各个地方获取,包括here(点击“源代码”标签)和here