使用RegEx将XML标记替换为空格(在标记的长度中)

时间:2009-08-26 13:25:30

标签: java xml regex

我需要从xml文档中删除所有xml标记,但保留标记占用的空间,以便文本内容保持与xml中相同的偏移量。这需要用Java完成,我认为RegExp是可行的方法,但我找不到简单的方法来获得与我的正则表达式匹配的标签的长度。

基本上我想要的是:

Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 
Matcher m = p.matcher(stringWithXMLContent); 
String strippedContent = m.replaceAll("THIS IS A STRING OF WHITESPACES IN THE LENGTH OF THE MATCHED TAG");

希望有人能帮助我以简单的方式做到这一点!

5 个答案:

答案 0 :(得分:4)

由于<>字符始终围绕XML中的起始和结束标记,因此使用简单的状态机可能会更简单。只需循环遍历所有字符(以某种可写形式 - 不存储在字符串中),如果在“替换模式”上遇到<翻转并开始用空格替换所有字符,直到遇到{{1} }。 (请务必同时替换初始>和结束<)。

如果您关心布局,可能希望避免替换制表符和/或换行符。如果您关心的是整个字符串长度,那显然无关紧要。

编辑:如果您想支持评论,处理说明和/或CData部分,您还需要明确地识别这些内容;此外,遗憾的是,属性值也可以包含>;所有这些意味着一个完整的实现将更加复杂,你想要。

常规换能器非常适合这项任务;但不幸的是,这些在类库中并不常见......

答案 1 :(得分:1)

Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); 

本着“无法使用Regexp解析XML”的精神,您知道对于任意XML来说,这不是一个合适的模式,对吧? (在属性值中包含&gt;字符是完全有效的,例如,更不用说其他非标记结构。)

  

我找不到简单的方法来获得与我的正则表达式匹配的标签的长度。

不要使用replaceAll,而是在Matcher上重复调用find。然后,您可以读取开始/结束以获取要替换的索引,或者在缓冲区上使用appendReplacement方法。例如

StringBuffer b= new StringBuffer();
while (m.find()) {
    String spaces= StringUtils.repeat(" ", m.end()-m.start());
    m.appendReplacement(b, spaces);
}
m.appendTail(b);
stringWithXMLContent= b.toString();

(StringUtils来自Apache Commons。有关更多背景和无库的替代方案,请参阅this question。)

答案 2 :(得分:1)

为什么不使用xml pull解析器,只需回显你想要保留的所有内容,例如:字符内容以及每当到达开始或结束标记时,使用元素的名称以及它具有的任何属性来查找长度,并写入适当数量的空格。

SAX API还具有可忽略空白的回调。因此,您还可以回显文档中出现的所有空格。

答案 3 :(得分:0)

也许m.start()和m.end()可以提供帮助。

m.start()=&gt; “匹配的第一个字符的索引” m.end()=&gt; “最后一个字符匹配后的偏移”

(m.end() - m.start()) - 2你知道你需要多少人。

答案 4 :(得分:0)

**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "")

你也可以试试这个。它搜索&lt;,然后/ 0或1出现,然后是字符仅1(小或大写字母),然后是&gt; ,然后*多次出现这种模式。

:)