我正在尝试从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"
部分。
为了使其与最小集匹配,我们需要在?
之后使用*
。