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の値を取得することです。そうすれば、最初の値を正しく維持しながら、2番目の値を壊すことができます。

文字列を分割する別の方法があります。

アップデート

私が手に入れたいのはウェブサイトだけなので、結局それを壊すことができます。それは私に大いに役立つでしょう。

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 : テキスト URL をクリック可能な HTML リンクに置き換える

彼らはこのようなことを提案しました

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