【问题标题】:This regex doesn't work for CDATA in xml. How do I fix this?此正则表达式不适用于 xml 中的 CDATA。我该如何解决?
【发布时间】:2013-04-11 04:04:48
【问题描述】:

我正在使用我们只允许我使用正则表达式的外部 API,我想解析来自像 <name>alwin</name> 这样的 xml 标签的内容,我使用 <.*?>.*?<.*/> 来解析“alwin”.. 它不起作用,但现在它的结构类似于<name><![CDATA[<table>alwin</table>]]</name>,我也希望能够解析CDATA..我也想提取[![CDATA[<table>alwin</table]]。也只是“alwin”。

【问题讨论】:

标签: java xml regex


【解决方案1】:

试试这个模式:

<([a-zA-Z]+).*?>(.*?)</\1>

\1 子句针对模式的第一个匹配组,即([a-zA-Z]+)。因此,匹配的结束标签将始终与开始标签相同。

标签的内容将在第二组中可用:

Pattern p = Pattern.compile("<([a-zA-Z]+).*?>(.*?)</\\1>");
Matcher m = p.matcher("<name><![CDATA[<table>alwin</table>]]</name>");
while (m.find()) {
    System.out.println(m.group(2));
}

上面的sn-p打印:

<![CDATA[<table>alwin</table>]]

重复上述输出的模式以获得alwin 部分。

【讨论】:

  • 这种方法对于&lt;foo&gt;&lt;![CDATA[&lt;foo&gt;&lt;/foo&gt;]]&gt;&lt;/foo&gt; 将失败,因为它将外部 与 CDATA 内的 匹配。即使忽略 CDATA 问题,通常嵌套的相同标签也会失败。
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多