1

在我的应用程序中,如果它大于 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 美元的价值,所以我可以打破第二个,保持第一个正确。

我有另一种方法来打破字符串。

更新

我想得到的只是网站,所以我毕竟可以打破它。这对我有很大帮助。

4

2 回答 2

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' 中转义 $ 和 \。

于 2011-06-12T07:31:38.560 回答
0

我认为您遇到了与此问题中提到的类似的问题

Java:用可点击的 HTML 链接替换文本 URL

他们提出了这样的建议

String basicUrlRegex =  "(.*://[^<>[:space:]]+[[:alnum:]/])"; 
myString.replaceAll(basicUrlRegex, "<a href=\"$1\">$1</a>");
于 2012-04-19T05:52:55.673 回答