これを使用して:
((<a href="entry://id=\d+">.*?</a>)|<!\[CDATA\[.*?\]\]>|<!--.*?-->|<.*?>)
それを replace all $2 と組み合わせると、あなたの例ではうまくいきます。以下のコードはそれを証明しています:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.junit.Assert.*;
import org.junit.Test;
public class TestStack1305864 {
@Test
public void matcherWithCdataAndComments(){
String s="The quick <span>brown</span> <a href=\"www.fox.org\">fox</a> jumped over the lazy <![CDATA[ > ]]> <a href=\"entry://id=6000009\">dog</a> <img src=\"dog.png\" />.";
String r="The quick brown fox jumped over the lazy <a href=\"entry://id=6000009\">dog</a> .";
String pattern="((<a href=\"entry://id=\\d+\">.*?</a>)|<!\\[CDATA\\[.*?\\]\\]>|<!--.*?-->|<.*?>)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(s);
String t = s.replaceAll(pattern, "$2");
System.out.println(t);
System.out.println(r);
assertEquals(r, t);
}
}
アイデアは、特定のグループに保持することに関心のあるすべての要素をキャプチャして、それらを文字列に挿入できるようにすることです。
このようにして、すべてを置き換えることができます:
興味深い要素と一致しないすべての要素について、グループは空になり、要素は "" に置き換えられます
興味深い要素については、グループは空ではなく、結果の文字列に追加されます.
編集: CDATA およびコメント内のネストされた < または > を処理します。