请教正则表达式的问题

digisdio 2011-08-22 03:09:55
如下所示的JDBC URL:
jdbc:sqlserver://haha.com:1433;DataBaSeNAME=xyz;a=b;b=3;c=2;

用如下的RegEx匹配后,仅能找到4个group,分别是“haha.com”、“1433”、“xyz”和“c=2”,不知为何“a=b”和“b=3”无法捕获,重点是红字粗体那部分,请高人赐教:

^jdbc:sqlserver://((?:(?:(?:(?:[\w&&[^_]])+(?:[\w|-])*(?:[\w]?[.]))*)(?:(?:[A-Z|a-z])+(?:[\w|-])*(?:[\w]?)))|(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:[0-9A-Fa-f]{1,4}|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,3})|(?:(?::[0-9A-Fa-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,4})|(?:(?::[0-9A-Fa-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,5})|(?:(?::[0-9A-Fa-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){1}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,6})|(?:(?::[0-9A-Fa-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9A-Fa-f]{1,4}){1,7})|(?:(?::[0-9A-Fa-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?)):([0-9]{1,5});([a-zA-Z]\w*=\w+;)*(?i:DatabaseName)=([a-zA-Z]\w*);*(?:([a-zA-Z]\w*=\w+);)*([a-zA-Z]\w*=\w+)?;*$
...全文
63 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
softroad 2011-08-22
  • 打赏
  • 举报
回复
其实用;分割最简单了。
softroad 2011-08-22
  • 打赏
  • 举报
回复
不知道这个可以不


String url = "jdbc:sqlserver://haha.com:1433;DataBaSeNAME=xyz;a=b;b=3;c=2;";
Pattern p = Pattern.compile("[\\w\\d\\:.=]+;");
Matcher m = p.matcher(url);


while(m.find()) {
System.err.println(m.group());
}

String[] s = url.split(";");
System.err.println(java.util.Arrays.toString(s));
digisdio 2011-08-22
  • 打赏
  • 举报
回复
前面那一大堆不用细看,是匹配是否ipv4或者ipv6或者主机名的,都删掉都行,而且那是久经考验的,就是port之后取db属性这部分达不到效果。
digisdio 2011-08-22
  • 打赏
  • 举报
回复
我就想提取host、port和dbname和其他的属性
digisdio 2011-08-22
  • 打赏
  • 举报
回复
红字粗体部分剪短改成这样也是同样的结果:
([a-zA-Z]\w*=\w+;)*(?i:DatabaseName)=([a-zA-Z]\w*);*(?:([a-zA-Z]\w*=\w+);*)*$
hahawaa1 2011-08-22
  • 打赏
  • 举报
回复
LZ 我绝对你应该重新输入一边 这种问题我碰到过 重新输入边就好了
softroad 2011-08-22
  • 打赏
  • 举报
回复
lz你这是啥啊,看的我头大,你就说你想干啥吧。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧