我正在尝试从Java字符串中删除所有XML标记。以我的方式看,如果它遵循以下一种或两种形式,则是XML标记:


<*>*<*/*>,例如<fizz>buzz< /fizz>;要么
<*/*>,例如< fizz />


我的正则表达式很简单:

String tagful = "Hello <fizz>buzz</fizz>Regexes!";
String tagless = tagful.replaceAll("<*>*<*/*>", "");
tagless = tagless.replaceAll("<*/*>", "");
System.err.println("TAGLESS:\n\t" + tagless);


运行此命令时,我得到Hello <fizzbuzz</fizzRegexes!作为输出,而(如果我的XML剥离代码正确的话)我应该得到Hello Regexes!。我要迷路了?

请注意:我不想使用任何现有的库。我在这里寻找纯Java正规表达式解决方案。提前致谢!

最佳答案

您需要将*更改为.*?。尝试使用"<.*?>.*?</.*?>""<.*?/>"。或者只是"<.*?>.*?</.*?>|<.*?/>"


*表示该元素之前的元素可以出现0次或多次。
.表示“换行标记旁边的任何内容”。


因此,<.*>将接受<>之间的任何内容。

但是以这种形式.*是贪婪的,并且在字符串中,例如"<abc>def<ghi>"将匹配"abc>def<ghi"部分。

为了使其与最小集匹配,我们需要在?之后使用*

09-28 15:03