我在正则表达式中非常弱,我正在使用的正则表达式(从互联网上找到)只能部分解决我的问题。我需要使用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
等其他扩展程序中失败。是否有任何方式可以在所有类型的扩展中使用?
答案 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”的整齐捕获。