部分URL的RegEx模式(在路径中打开两个值)

我有一个URL模式,需要包含APPLES或ORANGES,没有其他值。 可选地,它还可以具有查询参数。 我尝试了一些RegEx模式,但我无法得到一个尊重严格匹配的模式。

示例url

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之间的任何路径,因此使用 在很多地方。

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

**编辑:最终答案**

我的最终答案是从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总体上是格式良好的。

我认为*.*应该是.*

 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(许多其他语言都有这些),他们会为您处理所有这些特殊情况。

试试这个 :

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