正则表达式 - 在查询和/或片段上拆分URI

时间:2011-09-21 02:45:08

标签: regex uri

使用URI的这个定义

 <scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

我想把它分成三组; 1)scheme + heirarchy,2)query,3)fragment。

一些例子:

http://foo.com/bar?k1=v1&k2=v2#fragment = [http://foo.com/bar, ?k1=v1&k2=v2, #fragment]
http://foo.com/bar?k1=v1&k2=v2 = [http://foo.com/bar, ?k1=v1&k2=v2, ]
http://foo.com/bar#fragment = [http://foo.com/bar, , #fragment]
http://foo.com/bar = [http://foo.com/bar, , ]

目前我有.+(\?[^#]+)(.*)?$来处理案例1和案例2,4是不匹配的,但是我在编辑案例3时遇到了麻烦。

可以假设URI格式正确,我们只关心?#的存在。

上下文是我有一个URI输入,可能有一个查询和/或片段部分,我需要添加其他查询参数。因此,评估每个组的存在,我可以弄清楚我的参数应该如何插入/附加到URI。

实施是Java。

提前致谢。

3 个答案:

答案 0 :(得分:2)

试试这个:

(.+?)(\?.+?)?(#.+)?$

答案 1 :(得分:1)

http://mathiasbynens.be/demo/url-regex比较了许多url regexps与网址测试套件的准确性。非网址。您可以使用它来选择一个能够降低复杂性与准确性的方法。

http://www.codinghorror.com/blog/2008/10/the-problem-with-urls.html也是一篇关于使用网址提取正则表达式的问题的好文章。

您可以尝试类似

的内容
^(https?://[^?#]+)(\\?[^#]+)?(#.+)?$

如果您知道输入是网址,或使用

(https?://[^?#\\s]+)(\\?[^#\\s]+)?(#\\S+)?

在文本中找到匹配的网址。

答案 2 :(得分:0)

(.*)?由于?,不会生成一个群组。此外,只有在网址中有?时,您的正则表达式才会匹配。 #3没有?,因此在?之后添加\?。尝试:

.+(\??[^#]+)(.*)$