RegEx用于匹配XML字符串中的CDATA

时间:2019-05-01 11:46:26

标签: java regex regex-group

我的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));

1 个答案:

答案 0 :(得分:2)

请勿使用正则表达式解析HTML,而应使用 JSoup 之类的HTML解析器。

这里的问题是,您需要先调用matcherObject.find()(用它来在字符串中的任何地方查找模式)或matcherObject.matches()(用它来将整个字符串与模式匹配)方法,您可以访问匹配,并且还应该首先使用findmatches循环来检查ifwhile表示的值是否正确。另外,您需要调用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>