Получение значения $ 1 от matcher.replaceAll () - PullRequest
1 голос
/ 09 июня 2011

В моем приложении мне нужно получить ссылку и разорвать ее, если она больше 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 доллар, чтобы я мог сломать второй, сохранив первый правильно.

У меня есть другой способ разбить строку.

UPDATE

То, что я хочу получить, это только веб-сайт, чтобы я все-таки смог его сломать. Это мне очень поможет.

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Вы не можете использовать 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 (), чтобы не беспокоиться о экранировании $ и \ in 'truncatedURL'.

0 голосов
/ 19 апреля 2012

Я думаю, что у вас есть проблема, аналогичная той, которая упоминается в этом вопросе

Java: замена текстового URL на интерактивную ссылку HTML

они предложили что-то вроде этого

String basicUrlRegex =  "(.*://[^<>[:space:]]+[[:alnum:]/])"; 
myString.replaceAll(basicUrlRegex, "<a href=\"$1\">$1</a>");
...