Java正则表达式匹配除一个特殊情况外的所有html元素
我有一个带有标记的字符串,如下所示:Java正则表达式匹配除一个特殊情况外的所有html元素,java,regex,string,replace,markup,Java,Regex,String,Replace,Markup,我有一个带有标记的字符串,如下所示: 敏捷的布朗跳过了懒惰的布朗。 我正试着剥去一切,除了锚元素”entry://id=“里面。因此,上述示例的期望输出为: 敏捷的棕色狐狸跳过了懒惰的狐狸。 写下这场比赛,我迄今为止最接近的是: !* 但我不明白为什么这不起作用。任何帮助(除了“为什么不使用解析器”:)都将不胜感激 我真的不会使用regexps来解析HTML。HTML是不规则的,没有结束的边缘案例会绊倒你 改为签出。使用正则表达式不容易。我推荐一个理解HTML/XML语义的解析器 如果您坚持,您
敏捷的布朗跳过了懒惰的布朗。
我正试着剥去一切,除了锚元素”entry://id=“里面。因此,上述示例的期望输出为:
敏捷的棕色狐狸跳过了懒惰的狐狸。
写下这场比赛,我迄今为止最接近的是:
!*代码>
但我不明白为什么这不起作用。任何帮助(除了“为什么不使用解析器”:)都将不胜感激 我真的不会使用regexps来解析HTML。HTML是不规则的,没有结束的边缘案例会绊倒你
改为签出。使用正则表达式不容易。我推荐一个理解HTML/XML语义的解析器
如果您坚持,您可以采取多步骤方法,例如:
- 使用以下方法替换
“:
((<a href="entry://id=\d+">.*?</a>)|<!\[CDATA\[.*?\]\]>|<!--.*?-->|<.*?>)
(()| | |)
并将其与替换所有$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);
}
}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入静态org.junit.Assert.*;
导入org.junit.Test;
公共类TestStack1305864{
@试验
public void matcherWithCDATA和comments(){
String s=“敏捷的布朗跳过了懒惰的人]]>”;
String r=“敏捷的棕色狐狸跳过了懒惰的狐狸。”;
字符串模式=“(()| | |”)”;
Pattern p=Pattern.compile(Pattern);
匹配器m=匹配器p;
字符串t=s.replaceAll(模式,$2”);
系统输出打印ln(t);
系统输出println(r);
资产质量(r,t);
}
}
其思想是捕获您感兴趣保留在特定组中的所有元素,以便您可以将它们重新插入字符串中。
这样您就可以替换所有:
对于与感兴趣的元素不匹配的每个元素,组将为空,元素将替换为“”
对于感兴趣的元素,组将不会为空,并将附加到结果字符串
编辑:在CDATA和注释中处理嵌套的
编辑:有关regex合成模式的信息,请参阅,该模式旨在使regex更易于阅读,以便于维护。+1。类似的问题每天都会发布好几次。信不信由你,你根本无法解析[X][HT]ML和regex一起使用,并且试图这样做会让你产生奇怪的错误、混乱和安全漏洞。不要这样做。有HTML解析器。对不起,你似乎在使用“正则”作为技术术语。如果是,你能给我指一个参考吗?我现在要表明我的无知,并说regexps不会处理任意嵌套的结构(您可以通过CDATA区域等进行嵌套)。我不完全熟悉此场景中“regular”的正确定义,欢迎更合格的SOer发表评论!他不想验证html或理解它的语义,他只是试图删除标记。标记结构本身是规则的。我能想到的唯一情况是,您可以在哪里实际embbed'>'or'@Beta:regular在本文中指的是常规语言,如计算机科学中所用,并在此处解释:。