【问题标题】:Java Regex xml parsingJava 正则表达式 xml 解析
【发布时间】:2012-01-25 08:24:45
【问题描述】:

我正在尝试在 xml 中从头到尾查找标签并将其替换为空白。一个示例 xml 是这样的

<lins>
  <lin index="1"> ...<feature>Something</feature>... </lin>
  <lin index="2">...<feature>Something</feature>... </lin>
  <lin index="3">...<feature>Something</feature>....</lin>

  <lin index="1">...<feature>Icom</feature>... </lin>
  <lin index="2">...<feature>Icom</feature>... </lin>
<lins>

当我在两者之间看到 Icom 时,我需要删除 &lt;lin&gt;&lt;/lin&gt;

&lt;lin\s(.+?Icom.+?)+&lt;/lin&gt; 正在删除所有 lin 项目,因为它匹配第一个开始 &lt;lin&gt; 标记和最后一个 lin 结束标记。如果您能提出一种方法来做到这一点,我们将不胜感激。我也不能在我的情况下使用 xml 解析器。

【问题讨论】:

  • 请重新编写您需要删除的内容。不清楚。
  • 您没有选择使用某些 xml 解析器?
  • 我正在尝试在 xml 中从头到尾查找标签并将其替换为空白。问题中有一个示例 xml。在上面的例子中,我需要找到并删除 ... Icom... ... Icom... 规则是每当我看到 Icom 删除 我使用的正则表达式是删除所有 lin 标签。
  • 我的情况我不能使用 XML 解析器
  • 那是什么情况,几乎所有人类已知的平台都有 XML 解析器。

标签: java xml regex


【解决方案1】:
String result = subject.replaceAll("(?s)<lin\\b(?:(?!</lin).)*Icom(?:(?!</lin).)*</lin>", "");

应该这样做,除非您将&lt;lin&gt; 标签相互嵌套(或在 cmets/strings 中)。

说明:

<lin\b              # Match <lin (but not link or linen)
(?:                 # Match...
 (?!</lin)          # as long as we're not at a closing tag
 .                  # any character
)*                  # any number of times.
Icom                # Match Icom
(?:(?!</lin).)*     # (as above:) Match any character except closing tag
</lin>              # Match closing tag

【讨论】:

  • 如果有内部 标签则不匹配
  • @Ademiban:这正是我写的。此外,它匹配,但它会匹配字符串的不正确部分(这可能更糟,这就是为什么我写了&lt;lin&gt;标签不能嵌套)。
  • @user1110005 很高兴接受这个答案并在旁边打勾。
【解决方案2】:

你不能用正则表达式来做到这一点。
对于这个例子:

<tag>
    <tag> something </tag>
</tag>

<tag>
</tag>

如果您使用"&lt;tag&gt;(.*)&lt;/tag&gt;" 正则表达式,您的组将是:

    <tag> something </tag>
</tag>

<tag>

如果您使用"&lt;tag&gt;(.*?)&lt;/tag&gt;" 正则表达式,您的组将是这样的:

    <tag> something

你应该使用类似堆栈的东西来获取开始标签的结尾。

【讨论】:

  • 你的观点是有效的(关于嵌套字符串),但是你的例子都是错误的。
【解决方案3】:

我认为您需要向正则表达式添加更多组。

为前提条件添加一个组以开始检查 ex (

然后是中间内容的组,Icom 等的组。

所以在我的脑海中,我的 RegEx 看起来像:

(<lin\ index\=)(\w+Icom\w+)(\<\/lin>)

请注意,转义可能会略微偏离,但本质上您需要更多的组和一些不那么急切的匹配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多