用于删除XML标记的Java正则表达式无法正常工作

时间:2013-03-19 17:34:21

标签: java xml regex

我正在尝试从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正则表达式解决方案。提前谢谢!

3 个答案:

答案 0 :(得分:1)

也许您想要这样的东西 - 它将替换任何标签(即'&lt;&gt;'),无论标签的属性或雪佛龙内容如何,​​无论您想要称之为什么

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

答案 1 :(得分:1)

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

  • *表示之前的元素可以出现0次或更多次。
  • .表示“新线条旁边的任何内容”。

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

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

要使其与最小设置匹配,我们需要在?之后使用*

答案 2 :(得分:0)

你也可以尝试这个..

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