用于匹配来自 XML 个字符串的 CDATA 的正则表达式

RegEx for matching the CDATA from XML strings

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

你永远不应该用正则表达式解析 HTML,而是可以使用 HTML 解析器,比如 JSoup.

这里的问题是,您需要先调用 matcherObject.find()(使用它来查找字符串中任意位置的模式)或 matcherObject.matches()(使用它来匹配整个字符串与模式)方法,然后才能访问匹配项,并且您应该首先始终使用 ifwhile 循环检查 findmatches 返回的值是否为真。您还需要调用 group(1) 而不是 group(0)(这将 return 整场比赛)以访问 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>