近来对正则表达式有了浓厚的兴趣,索性加上先前模糊的记忆来次练习,在使用中学习.
1.问题
将url为"http://user:pass@api.data.sina.com.cn:80/about-me/afb/afc/service.cgi?t=100102&a=123#hash"按照协议,域名,路径,文件,参数,片段进行匹配.
2.分析
在这里先介绍一下分组的意义,取多组数据时,可以使用()进行分组,在java中匹配可以通过group(序号)来进行匹配.jdk7中已经增加了通过组命名的方式来匹配,之前的版本还不支持.
先考虑一下如何匹配http这个协议,可以通过
1 ^([^:]+)://
来匹配,^表示非,非:的多个字符,后面跟着://
^([^:]+)://(?:([^:@]+):?([^@]+)@)?([^:/?]+):?(\d*)?/(.*)/([^\?#]+)\??([^#]+)#?(.*)$
这样可以通过java中的api输出
1 String url = "http://user:pass@api.data.sina.com.cn:80/about-me/afb/afc/service.cgi?t=100102&a=123#hash"; 2 Pattern p = Pattern.compile("^([^:]+)://(?:([^:@]+):?([^@]+)@)?([^:/?]+):?(\d*)?/(.*)/([^\?#]+)\??([^#]+)#?(.*)$"); 3 Matcher m = p.matcher(url); 4 if (m.find()) { 5 System.out.println(m.group(1)); 6 System.out.println(m.group(2)); 7 System.out.println(m.group(3)); 8 System.out.println(m.group(4)); 9 System.out.println(m.group(5)); 10 System.out.println(m.group(6)); 11 System.out.println(m.group(7)); 12 System.out.println(m.group(8)); 13 System.out.println(m.group(9)); 14 }