使用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。
提前致谢。
答案 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没有?
,因此在?
之后添加\?
。尝试:
.+(\??[^#]+)(.*)$