【问题标题】:Remove text between tags w/regex [duplicate]使用正则表达式删除标签之间的文本[重复]
【发布时间】:2012-03-12 09:33:39
【问题描述】:

我正在尝试删除标签之间的文本并将标签添加到字符串数组中。

例如: 去掉这个

我正在逐行读取文本文档并添加每个标签,打开或关闭数组,中间没有文本,但我遇到了麻烦。

我有 String[] tags = text.nextLine().split("");但我不确定正则表达式应该是什么数组 [tag1,tag2,/tag2,/tag1]

谢谢!

【问题讨论】:

    标签: java xml regex


    【解决方案1】:

    你可以这样写:

    String[] tags = text.nextLine().split("(?:^|>)[^<]*(?:<|$)");
    

    但使用真正的 XML 解析器可能更安全。请注意,如果有任何 cmets &lt;!-- ... --&gt; 或处理指令 &lt;? ... ?&gt; 或诸如此类,或者如果其中一个标签包含 &gt;(例如,&lt;span title='12 &gt; 11'&gt;),或者在各种其他情况下,上述行为将不正常。正则表达式不是解析 XML 的好工具。


    编辑添加:为避免第一个元素为空,您可以进行一些预处理以去除第一个标记之前的所有内容,并相应地调整split

    String[] tags = text.nextLine().replaceFirst("^[^<]*<?").split(">[^<]*(?:<|$)");
    

    (注意:如果text.nextLine() 根本不包含任何标签,那么这将导致一个包含单个空元素的数组。如果你想摆脱它,你可以作为第二步来做在上述之后:

    if(tags.size == 1 && tags[0].isEmpty())
        tags = new String[0];
    

    )

    【讨论】:

    • 这个任务的重点是制作我自己的 XML 解析器来使用堆栈检查文件的有效性。上面的表达式有效,除了 tags[0] 总是“”。有什么东西可以去掉第一个空元素吗?
    • @Steve:我已经更新了我的答案来解决这个问题。
    【解决方案2】:

    XML 不是正则语言,因此不能单独使用正则表达式对其进行解析。那是基础计算机科学。您使用了错误的工具来完成这项工作。

    我知道这是一项学生练习,学生有时会布置作业,例如用大锤敲碎坚果,但任何计算机专业人士的反应仍然是,这不是这样做的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2012-08-26
      • 1970-01-01
      • 2014-07-26
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多