正则表达式只匹配URL的一部分 - 为什么?

时间:2013-07-01 06:24:49

标签: java regex

我在正则表达式中非常弱,我正在使用的正则表达式(从互联网上找到)只能部分解决我的问题。我需要使用java从文本输入向URL添加锚标记。这是我的代码:

String text ="Hi please visit www.google.com";
String reg = "\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";
        String s = text.replaceAll(reg, "<a href='$1'>$1</a>");
        System.out.println(""+s);

目前的输出为Hi please visit <a href='www.google.c'>www.google.c</a>om。正则表达式有什么问题?

我需要解析文本并在jsp页面中显示从文本字段输入的URL作为热链接。预期的实际输出将是

Hi please visit <a href='www.google.com'>www.google.com</a>

修改

关注正则表达式

(http(s)?://)?(www(\.\w+)+[^\s.,"']*)

的工作方式类似于以.com结尾的网址中的图标,但在.jsp等其他扩展程序中失败。是否有任何方式可以在所有类型的扩展中使用?

2 个答案:

答案 0 :(得分:4)

回答你的问题为什么正则表达式不起作用:它没有遵守Java的正则表达式语法规则。

具体做法是:

[^[:punct:]\s]

无法按预期工作,因为Java无法识别像[:punct:]这样的POSIX缩写。相反,它将其视为嵌套字符类。这再次导致^在该上下文中变为非法,因此Java忽略它,为您留下与

相同的字符类
[:punct\s]

仅匹配c的{​​{1}},因此结束了您的匹配。

关于如何在一个文本块中查找URL的问题,我建议您阅读Jan Goyvaert的优秀博客文章Detecting URLs in a block of text。你需要自己决定你想要制作正则表达式的敏感程度和具体程度。

例如,帖子末尾提出的解决方案将转换为Java

com

答案 1 :(得分:2)

Java识别posix表达式(see javadoc),但语法略有不同。它看起来像这样:

\p{Punct}

但我会将你的正则表达式简化为:

(?i)(http(s)?://)?((www(\.\w+)+|(\d{1,3}\.){3}\.\d{1,3})[^\s,"']*(?<!\\.))

只有在找到破坏它的测试用例时才详细说明。

作为一个java行,它将是:

text = text.replaceAll("(?i)(http(s)?://)?((www(\\.\w+)+|(\\d{1,3}\\.){3}\\d{1,3})[^\\s,\"']*(?<!\\.))", "<a href=\"http$2://$3\">$3</a>");

请注意,如果需要,可以恢复“https”(如果找到)中“s”的整齐捕获。