从matcher.replaceAll()获得$ 1的价值

时间:2011-06-09 17:53:24

标签: java regex matcher

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

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

更新

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

2 个答案:

答案 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>");