用于匹配来自 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()
(使用它来匹配整个字符串与模式)方法,然后才能访问匹配项,并且您应该首先始终使用 if
或 while
循环检查 find
或 matches
返回的值是否为真。您还需要调用 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>
我的 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()
(使用它来匹配整个字符串与模式)方法,然后才能访问匹配项,并且您应该首先始终使用 if
或 while
循环检查 find
或 matches
返回的值是否为真。您还需要调用 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>