【问题标题】:RegEx for matching the CDATA from XML strings用于匹配 XML 字符串中的 CDATA 的正则表达式
【发布时间】:2019-05-01 11:46:26
【问题描述】:

我的 xml 字符串是:

    String neMsg= "<root>" 
              +"   <CONTENT>"
              +"                <![CDATA[00000:<ResponseClass Name=\"Response\"><ITEM>HAHA</ITEM></ResponseClass>]]>"
              +"        </CONTENT>"
              +"</root>";

我已经尝试使用四种方式编写代码,但仍然无法获取内容。我该如何解决这个问题?

 //java.util.regex.Pattern pP0=java.util.regex.Pattern.compile("<!\\[CDATA\\[00000:(\\s|\\S)*?\\]\\]>");
     // java.util.regex.Pattern pP0=java.util.regex.Pattern.compile("<!\\[CDATA\\[00000:(.*)\\]\\]>");
     // java.util.regex.Pattern pP0=java.util.regex.Pattern.compile("<CONTENT>(.*)<!\\[CDATA\\[(.*)\\]\\]>(.*)</CONTENT>");
     Pattern pP0 = Pattern.compile(".*<!\\[CDATA\\[00000:(.*)\\]\\]>.*");
    java.util.regex.Matcher mP0= pP0.matcher(neMsg);
      System.out.println(mP0.group(1));

【问题讨论】:

标签: java regex regex-group


【解决方案1】:

您不应该使用正则表达式解析 HTML,而是可以使用 HTML 解析器,例如 JSoup

这里的问题是,在访问匹配并且您应该首先使用ifwhile 循环检查findmatches 返回的值是否为真。此外,您需要调用 group(1) 而不是 group(0)(这将返回整个匹配项)来访问 group1 中的内容。

把你的代码改成这个,

String neMsg = "<root>" + "   <CONTENT>"
        + "                <![CDATA[00000:<ResponseClass Name=\"Response\"><ITEM>HAHA</ITEM></ResponseClass>]]>"
        + "        </CONTENT>" + "</root>";

Pattern pP0 = Pattern.compile(".*<!\\[CDATA\\[00000:(.*)\\]\\]>.*");
java.util.regex.Matcher mP0 = pP0.matcher(neMsg);
if (mP0.find()) { // matches method will also work because your pattern is wrapped with `.*` from both sides
    System.out.println(mP0.group(1));
}

打印整个匹配,

<ResponseClass Name="Response"><ITEM>HAHA</ITEM></ResponseClass>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多