RegEx для сопоставления CDATA из строк XML - PullRequest
0 голосов
/ 01 мая 2019

Моя строка 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 Ответ

2 голосов
/ 01 мая 2019

Вы никогда не должны анализировать HTML с помощью регулярных выражений и вместо этого можете использовать HTML-анализатор, например JSoup .

И проблема здесь в том, что вам нужно сначала вызвать matcherObject.find() (используйте это для поиска шаблона в любом месте строки) или matcherObject.matches() (используйте это для сопоставления всей строки с шаблоном), прежде чем вы сможете получить доступ к соответствия, а также вы должны всегда проверять, является ли значение, восстановленное с помощью find или matches, истинным, используя цикл if или while. Также вам нужно вызвать 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>
...