在我的应用程序中,如果它大于10(示例)字符,我需要获取链接并将其中断。 问题是,如果我发送整个文本,例如:“这是我的网站www.stackoverflow.com”直接到这个匹配器
Pattern patt = Pattern.compile("(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>???“”‘’]))");
Matcher matcher = patt.matcher(text);
matcher.replaceAll("<a href=\"http://$1\" target=\"_blank\">$1</a>");
它会显示整个网站,而不会破坏它。
我试图做的是获得1美元的价值,所以我可以打破第二个,保持第一个正确。
我还有另一种方法来破解字符串。
更新
我想得到的只是网站,所以我可以打破它。这对我有很大帮助。
答案 0 :(得分:2)
你不能使用replaceAll;你应该遍历匹配并单独处理每个匹配。 Java的Matcher已经有了API:
// expanding on the example in the 'appendReplacement' JavaDoc:
Pattern p = Pattern.compile("..."); // your URL regexp
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String truncatedURL = m.group(1).replaceFirst("^(.{10}).*","$1..."); // i iz smrt
m.appendReplacement(sb,
"<a href=\"http://$1\" target=\"_blank\">"); // simple replacement for $1
sb.append(truncatedURL);
sb.append("</a>");
}
m.appendTail(sb);
System.out.println(sb.toString());
(为了提高性能,你应该为循环中的replace *调用分解编译模式。)
编辑:使用sb.append(),以免担心在'truncatedURL'中转义$和\。
答案 1 :(得分:0)
我认为你遇到与这个问题上提到的问题类似的问题
Java : replacing text URL with clickable HTML link
他们建议这样的事情
String basicUrlRegex = "(.*://[^<>[:space:]]+[[:alnum:]/])";
myString.replaceAll(basicUrlRegex, "<a href=\"$1\">$1</a>");