我有一个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
尝试过RegEx模式(好吧,至少最佳尝试)
(http://*.*.website*.*.com/*.*/pages(/APPLES)|(/ORANGES)[\?]*.*)
(http://*.*.website*.*.com/*.*/pages(/APPLES|/ORANGES)[\?]*.*)
如果你很好奇,我故意想要允许任何子域,后缀“网站”(针对不同的环境),以及.com /和/ pages之间的任何路径,因此使用。< / em>在很多地方。
实现这一目标的最佳方式是什么?
**编辑:最终答案**
我的最终答案是从math.coffee和fardjad合并而来。
^https?://.*\.website\b.*\.com/.*/pages/(APPLES\b|ORANGES\b)((\?\w+=\w+)(&?\w+=\w+)*)?$
我发现的一个限制是它不会在查询字符串参数key = value对中允许一些有效字符(.~_-%+)(参见:http://en.wikipedia.org/wiki/Query_string#Structure)。这对我来说不是问题,因为我匹配从.NET的Uri类返回的字符串,所以我知道URL整体上是格式良好的。
答案 0 :(得分:3)
我认为*.*
应为.*
:
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.
注意 - 通常使用正则表达式解析查询字符串并确保它是一个语法上有效的正则表达式。
例如,在我上面提供的正则表达式中,我已经说过&amp; key = value中的值不能包含&符号。但它可能是一个转义实体,例如&
,其中 合法。
当您尝试使用正则表达式解析语法时,您将始终遇到此类问题。这是您必须承担的风险。
或者,我确信有一个C#模块可以解析URL(许多其他语言都有这些),他们会为你处理所有这些特殊情况。
答案 1 :(得分:1)
尝试this:
^https?://(www\.)?\w+[^/]+(/\w+(?=/)){2}/(PAGE1|PAGE2)((\?\w+=\w+)(&?\w+=\w+)*)?$