2012-03-09 34 views
3

我有一个URL模式,它需要包含APPLES或ORANGES,没有其他值。或者,它也可以具有查询参数。我已经尝试过许多RegEx模式,但我无法获得尊重严格匹配的模式。部分URL的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之间的任何路径,因此使用在很多地方。

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

**编辑:最后的答案**

我最后的答案是从mathematical.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是整体良构的。

回答

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. 

注 - 通常有分析查询字符串与正则表达式,并确保它是一个语法上有效的正则表达式的问题。

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

当你尝试用正则表达式解析语法时,你总会遇到这样的问题。这是一个你必须承担的风险。

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

+0

感谢您的快速答复!真的很感谢你的模式的详细分解:)我使用PAGE1和PAGE2作为占位符,实际上我有两个不同的单词(例如APPLE,ORANGE);对不起,在这一点上不清楚。我更新了我的问题以反映这一点。我尝试修改你的模式如下,但我错过了一些东西,因为它不正确匹配。 '''code'http://.* \ .website \ b。* \ .com /.*/ pages/APPLES \ b | ORANGES \ b(\?[^ =] + = [^&=] +( &[^ =] + = [^ =&] +)*)? – 2012-03-09 05:03:07

+0

你必须在变化周围添加括号:'(APPLES | ORANGES)'。 – 2012-03-09 05:10:05

+0

真棒,得到它所有的工作。您的模式没有过滤掉所有我的不良网址,所以我混合并匹配了您的模式片段和@fardjad中的一个,直到所有测试通过。只是我不太担心的一个小问题是,在查询参数中我不能有几个允许的字符,但是因为我匹配从.NET URI返回的字符串,所以应该没问题。最终模式:'code'^https?://.* \ .website \ b。* \ .com /.*/ pages /(APPLES \ b | ORANGES \ b)((\?\ w + = \ w +)( &?\ w + = \ w +)*)?$ – 2012-03-09 05:56:19

1

尝试this

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