2017-06-14 209 views
-4

我有一个XML输出如下所示正则表达式来结合标签

<B-company> The British </B-company> <I-company> Broadcasting Corporation is a </I-company> <B-Type> public </B-Type> <I-Type> service broadcaster </I-Type> <HQ> headquartered </HQ> <B-company> at </B-company> <I-company> Broadcasting </I-company> <B-Type> House </B-Type> <I-Type> in </I-Type> <HQ> London </HQ> 

这里B-tag为开始标签和I-标签显示延续标签/结束标记(如果没有进一步的I-标签被找到)。

我期待这样的事情作为一个输出

<company> The British Broadcasting Corporation is a </company> <Type> public service broadcaster </Type> <HQ> headquartered </HQ> <company> at Broadcasting </company> <Type> House in </Type> <HQ> London </HQ> 

即字符“B-”需要从这样的第一标签形成和所有的标签被删除,直到我们有“/ I-”标记并添加到最后。我们如何在java正则表达式中实现这一点。

+1

[使用XML解析器代替?](https://stackoverflow.com/a/1732454/2773311)关于使用正则表达式解析XML/HTML ... – Arc676

+1

@ Arc676它很难被称为“解析”,如果输出是xml。这些看起来像基本的字符串操作,只是字符串恰好是xml。 –

+1

@Rawing,你是对的。它只是用一些标签编码的基本字符串。它不遵循正常的XML约定。对我来说,使用XML解析器似乎对此有点矫枉过正。因此,正则表达式的方法 – Betafish

回答

1

你可以试试这个正则表达式:

</[BI]-(\w+)>\s*<I-\1>|(</?)[BI]-(\w+>) 

\2\3取代。

Online demo.


做些什么:

</[BI]-(\w+)>\s*<I-\1>关闭标签紧跟一个延续标签相匹配。这些文本都没有在第2或第3组中被捕获,因此所有与此匹配的文本都将被删除。

(</?)[BI]-(\w+>)然后匹配以B-I-开头的其余标签。它捕获组2和组3中的B-I-周围的文本,所以通过替换\2\3,可以有效地删除B-I-

+0

在线演示网站帮助了很多。这是我正在寻求解释我的天真正则表达式技能。 – Betafish