【问题标题】:Java regex to strip out XML tags is not working去除 XML 标记的 Java 正则表达式不起作用
【发布时间】:2013-03-08 13:02:42
【问题描述】:

我正在尝试从 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 &lt;fizzbuzz&lt;/fizzRegexes! 作为输出,而(如果我的 XML 剥离代码是正确的),我应该得到Hello Regexes!。我会误入歧途吗?

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

【问题讨论】:

  • 您无法使用正则表达式解析 XML。 为什么您反对为此使用适当的解析器?
  • "*" 不是 Java 正则表达式(或大多数正则表达式)中的通配符。它是一个“零个或多个”量词,它被应用于它之前的任何东西。单字符通配符正则表达式是“。” (点或句号)。
  • [剥离标签(只去除标签)]和[去除标签及其里面的所有内容]是不同的。我不知道你想用这个实现什么。

标签: java xml regex


【解决方案1】:

您需要将您的* 更改为.*?。试试"&lt;.*?&gt;.*?&lt;/.*?&gt;""&lt;.*?/&gt;"
或者只是"&lt;.*?&gt;.*?&lt;/.*?&gt;|&lt;.*?/&gt;"

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

所以&lt;.*&gt; 将接受介于&lt;&gt; 之间的任何内容。

但在这种形式中.* 是贪婪的,并且在诸如"&lt;abc&gt;def&lt;ghi&gt;" 之类的字符串中将匹配"abc&gt;def&lt;ghi" 部分。

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

【讨论】:

  • @khachik 搜索“勉强量词”
  • 宾果邦戈邦戈!您将在 7 分钟内获得绿色支票。
【解决方案2】:

也许你想要这样的东西 - 它会替换任何标签(即''),无论标签的属性或人字形内容如何,​​无论你想如何称呼它

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

【讨论】:

  • 感谢@Tucker (+1) - 但您的解决方案打印出Hello buzzRegexes!
【解决方案3】:

你也可以试试这个..

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多