Java 使用RegExp将XML标记替换为空格(标记的长度)
我需要从xml文档中去掉所有xml标记,但保留标记占用的空间,以便文本内容保持与xml中相同的偏移量。这需要在Java中完成,我认为RegExp是一种可行的方法,但我没有找到简单的方法来获得与正则表达式匹配的标记长度 基本上我想要的是:Java 使用RegExp将XML标记替换为空格(标记的长度),java,xml,regex,Java,Xml,Regex,我需要从xml文档中去掉所有xml标记,但保留标记占用的空间,以便文本内容保持与xml中相同的偏移量。这需要在Java中完成,我认为RegExp是一种可行的方法,但我没有找到简单的方法来获得与正则表达式匹配的标记长度 基本上我想要的是: Pattern p = Pattern.compile("<[^>]+>[^<]*]+>"); Matcher m = p.matcher(stringWithXMLContent); String strippedConten
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");
Pattern p=Pattern.compile(“]+>[^”);
Matcher m=p.Matcher(stringWithXMLContent);
String strippedContent=m.replaceAll(“这是匹配标记长度中的一个空白字符串”);
希望有人能帮助我以一种简单的方式做到这一点!因为XML中的开始和结束标记总是围绕着字符,使用简单的状态机可能会更简单。只需循环所有字符(以某种可写形式-不存储在字符串中),如果在“替换模式”并开始用空格替换所有字符,直到遇到代码>(请确保同时替换开头的
和结束代码>)
如果您关心布局,您可能希望避免替换制表符和/或换行符。如果您只关心字符串的总长度,那么这显然无关紧要
编辑:如果您想要支持注释、处理说明和/或CData部分,您也需要明确地识别它们;而且,不幸的是,属性值也可以包括
;所有这些都意味着一个完整的实现将比您想要的更复杂
常规转换器非常适合此任务;但不幸的是,这些转换器在类库中并不常见……因为XML中的开始和结束标记总是围绕着
字符,使用简单的状态机可能更简单。只需循环所有字符即可(以某种可写形式-不存储在字符串中),如果遇到
(请确保同时替换初始
和结束代码>)
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>");
如果您关心布局,您可能希望避免替换制表符和/或换行符。如果您只关心字符串的总长度,那么这显然无关紧要
编辑:如果您想要支持注释、处理说明和/或CData部分,您也需要明确地识别它们;而且,不幸的是,属性值也可以包括
;所有这些都意味着一个完整的实现将比您想要的更复杂
常规转换器非常适合此任务;但不幸的是,这些转换器在类库中并不常见
Pattern p = Pattern.compile("<[^>]+>[^<]*]+>");
(StringUtils来自Apache Commons。有关更多无背景和无库的替代方案,请参阅。)
(StringUtils来自Apache Commons。有关更多无背景和无库的替代方案,请参阅。)为什么不使用xml拉式解析器,在遇到它时简单地回显您想要保留的所有内容,例如字符内容,每当您到达开始或结束标记时,使用元素的名称以及它所具有的任何属性找出长度,并写入适当的空格数
SAX API还具有可忽略空白的回调。因此,您还可以回显文档中出现的所有空白。为什么不使用xml拉式解析器,只需回显遇到的所有内容,例如字符内容,并在到达开始或结束标记时使用元素名称找出长度,加上它所具有的任何属性,并写入适当数量的空格 SAX API还具有可忽略空白的回调。因此,您还可以回显文档中出现的所有空白。也许m.start()和m.end()会有所帮助 m、 start()=>“匹配的第一个字符的索引” m、 end()=>“匹配最后一个字符后的偏移量” (m.end()-m.start())-2并且您知道需要多少个/s。也许m.start()和m.end()可以帮助您
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "")
m、 start()=>“匹配的第一个字符的索引”
m、 end()=>“匹配最后一个字符后的偏移量”
(m.end()-m.start())-2,您知道需要多少个/s。**string**.replaceAll(“()*”,”)
**string**.replaceAll("(</?[a-zA-Z]{1}>)*", "")
您也可以尝试此方法。它会搜索此模式的多个匹配项,然后*搜索此模式的多个匹配项
:)**字符串**.replaceAll(“()*”,“”)
您也可以尝试此方法。它会搜索此模式的多个匹配项,然后*搜索此模式的多个匹配项
:)为什么,哦,为什么每个人都认为正则表达式可以解决所有与字符有关的问题?:(因为大多数时候它是,对吗?;)为什么,哦,为什么每个人都认为正则表达式可以解决与字符有关的所有问题?:(因为大多数时候它是,对吗?;)这基本上是可行的,但是如果您遇到一些标记周围的注释,例如,结束“->”将保留在那里(还有标记中的“Hello”)。但这应该足以满足我目前的需要。如果字符串偏移量不是问题,您可以简单地使用XPath表达式“//text()“-填充空格以填充相同的字符串长度…这基本上是可行的,但是如果在某些标记周围遇到注释,例如,结束“->”将保留在那里(以及标记内的“Hello”)。但这应该足以满足我目前的需要。如果字符串偏移量不是问题,您可以简单地使用XPath表达式“//text()”-用空格填充相同的字符串长度…谢谢,这正是我一直在寻找的匹配器的功能!谢谢,这正是我一直在寻找的匹配器的功能!抱歉,忽略了bobincesorry的帖子,忽略了