Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式匹配除一个特殊情况外的所有html元素_Java_Regex_String_Replace_Markup - Fatal编程技术网

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在本文中指的是常规语言,如计算机科学中所用,并在此处解释:。