使用这个:
((<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 和注释中处理嵌套的 < 或 >
编辑:请参阅http://martinfowler.com/bliki/ComposedRegex.html了解正则表达式组合模式,旨在使正则表达式更具可读性以用于维护目的。