【问题标题】:RegEx pattern for partial URL (switch on two values in path)部分 URL 的正则表达式模式(打开路径中的两个值)
【发布时间】:2012-03-09 04:16:28
【问题描述】:

我有一个 URL 模式,其中需要包含 APPLES 或 ORANGES,没有其他值。可选地,它也可以有查询参数。我已经尝试了许多 RegEx 模式,但我就是无法获得符合严格匹配的模式。

示例网址

http://www.website.com/en/pages/APPLES
http://www.website.com/en/pages/APPLES?k=v
http://www.website.com/en/pages/ORANGES?k=v&k2=v2
http://www.website.com/en/pages/ORANGES

不好

http://www.website.com/en/pages/APPLES???k=v
http://www.website.com/en/pages/APPLES?k=v=v
http://www.website.com/en/pages/APPLESORANGES
http://www.website.com/en/pages/1APPLES
http://www.website.com/en/APPLES

尝试过的正则表达式模式(嗯,至少是最佳次尝试)

(http://*.*.website*.*.com/*.*/pages(/APPLES)|(/ORANGES)[\?]*.*)
(http://*.*.website*.*.com/*.*/pages(/APPLES|/ORANGES)[\?]*.*)

如果您好奇,我有意允许任何子域、“网站”之后的后缀(针对不同的环境)以及 .com/ 和 /pages 之间的任何路径,因此使用 。 在很多地方。

实现这一目标的最佳方法是什么?

**编辑:最终答案**

我的最终答案是从 math.coffee 和 fardjad 合并而来的。

^https?://.*\.website\b.*\.com/.*/pages/(APPLES\b|ORANGES\b)((\?\w+=\w+)(&?\w+=\w+)*)?$

我发现的唯一限制是它不允许在查询字符串参数键=值对中使用一些有效字符 (.~_-%+)(请参阅:http://en.wikipedia.org/wiki/Query_string#Structure)。这对我来说不是问题,因为我正在匹配从 .NET 的 Uri 类返回的字符串,所以我知道 URL 总体上格式正确。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    我认为*.* 应该是.*

    http://.*\.website\b.*\.com/.*/pages/PAGE[12](\?[^=]+=[^&=]+(&[^=]+=[^=&]+)*)?
    

    解释:

    http://      # just http://
    .*\.         # any thing, just make sure it's followed by '.'
    website\b    # website, the whole word
    .*\.com      # anything between website and .com
    /.*/pages/   # anything between the .com and the pages
    PAGE[12]     # PAGE1 or PAGE2
    (\?          # opening bracket and '?' (query string)
    [^=]+        # the key: i've said it can't include =
    =            # =
    [^=&]+       # the value: i've said it can't include = or &
    (&           # opening bracket and '&' for next part of query string
    [^=]+=[^=&]+ # key=value pair, same regex as before
    )*           # 0 or more of these (the &key=value)
    )?           # the entire query string is optional.
    

    注意 - 使用正则表达式解析查询字符串并确保它是语法上有效的正则表达式通常会出现问题。

    例如,在我上面提供的正则表达式中,我已经说过 &key=value 中的值不能包含与号。但它可能是一个转义的实体,例如&,这合法的。

    当您尝试使用正则表达式解析语法时,您总是会遇到此类问题。这是您必须承担的风险。

    另外,我确信有一个 C# 模块来解析 URL(许多其他语言都有这些),它们会为您处理所有这些特殊情况。

    【讨论】:

    • 感谢您的快速回答!非常感谢您的模式所做的详细分类:) 我使用 PAGE1 和 PAGE2 作为占位符,实际上我有两个不同的词(例如 APPLE、ORANGE);很抱歉在这一点上不清楚。我已经更新了我的问题以反映这一点。我尝试按如下方式修改您的模式,但我遗漏了一些东西,因为它没有正确匹配。 codehttp://.*\.website\b.*\.com/.*/pages/APPLES\b|ORANGES\b(\?[^=]+=[^&=]+(&[ ^=]+=[^=&]+)*)?
    • 您必须在交替周围添加括号:(APPLES|ORANGES)
    • 太棒了,一切正常。您的模式没有过滤掉我所有的错误 URL,因此我混合并匹配了您的模式的 sn-ps 和来自@fardjad 的模式,直到我的所有测试都通过。我不太担心的唯一小问题是我不能在查询参数中包含一些允许的字符,但是由于我正在匹配从 .NET URI 返回的字符串,所以应该没问题。最终模式:code^https?://.*\.website\b.*\.com/.*/pages/(APPLES\b|ORANGES\b)((\?\w+=\w+)( &?\w+=\w+)*)?$
    【解决方案2】:

    试试this:

    ^https?://(www\.)?\w+[^/]+(/\w+(?=/)){2}/(PAGE1|PAGE2)((\?\w+=\w+)(&?\w+=\w+)*)?$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 2020-01-18
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多