2009-08-26 107 views
1

我需要从XML文档中去除所有xml标签,但保留标签占用的空间,以便文本内容保持与在xml中。这需要用Java来完成,我认为RegExp会成为一种方式,但我没有找到简单的方法来获得与我的正则表达式匹配的标签长度​​。使用RegExp用空白替换XML标签(在标签的长度中)

基本上我想是这样的:

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"); 

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

+3

为什么,哦,为什么每个人都认为正则表达式是与角色有关的所有事情的解决方案? :( – Bombe 2009-08-26 13:41:38

+1

因为大部分时间都是这样,对吧?;) – jhoff 2009-08-26 13:52:32

回答

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

在你的精神不能解析XML随着正则表达式,你就知道这是不是任意的XML适当的花样,对不对? (在属性值中包含>字符是完全有效的,例如,更不用说其他非标记结构。)

我发现没有简单的方法来获得符合我的常规标记的长度表达。

代替使用replaceAll,在匹配器上重复调用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的百科全书。欲了解更多的背景和免费的图书馆的替代品见this question。)

+0

谢谢,这正是Matcher I的功能一直在寻找! – jhoff 2009-08-26 15:02:24

4

由于<>字符总是围绕着XML中的起始和结束标签,所以对于简单的状态机来说,这可能会更简单。简单地遍历所有字符(以某种可写形式 - 未存储在字符串中),并且如果在“替换模式”中遇到<翻转并开始用空格替换所有字符,直到遇到>。 (请务必替换最初的<和关闭>)。

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

编辑:如果您要支持注释,处理指令和/或CData部分,您还需要明确识别这些注释,同样,不幸的是,属性值也可以包括>;所有这些意味着一个全面的实现将会更加复杂,你会喜欢。

一个常规的传感器将完美的完成这项任务;但不幸的是那些不完全常用的类库中......

+1

这个基本上可以工作,但是如果你遇到一些标签的评论,例如

+0

对不起,忽略从bobince的帖子 – 2009-08-27 13:20:41

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

你也可以试试这个。它搜索<,然后/ 0或1发生,然后字符只有1(小或大写字母),然后跟一个>,然后*多次出现此模式。

:)