使用正则表达式从另一个集合中删除标记集

时间:2010-09-10 14:06:59

标签: xml regex bbedit

我有一个大型XML文件,我正在使用BBEdit进行编辑。

在XML文件中,这是旧日记的数字重新创建,是包含在注释标记中的文本。

<note>Example of a note.</note>

但是,某些注释标记的引号中嵌有引号,并嵌入其中。

<note>Example of a note, but <quote>"here is a quotation within the note"</quote></note>

我需要从note标记中删除所有引用实例,同时保留引号标记的实际内容。所以这个例子就变成了:

<note>Example of a note, but "here is a quotation within the note"</note>

我已经在BBEdit中使用了GREP来成功删除其中的一些,但是我开始陷入更复杂的注释标记,这些注释标记遍历多行或者在两组不同的标记之间存在文本。例如:

<note>Example of a note, <quote>"with a quotation"</quote> and a <quote>"second quotation"</quote> along with some text outside of the quotation before the end of the note.</note>

有些报价可以超过10行。在我的正则表达式中使用\ rr似乎没有帮助。

我还应该说,引号标签可以存在于注释标签之外,这排除了批量查找/引用和删除它的可能性。我仍然需要在文档中使用引用标记,而不是在注释标记内。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用XSLT非常简单:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="quote">
    <xsl:apply-templates select="node()|@*" />
  </xsl:template>
</xsl:stylesheet>

使用您选择的XSLT处理器将此样式表应用于XML文件。例如,有一些工具可以在命令行上运行。

答案 1 :(得分:0)

不限制XML的形成方式,我很确定这超出了常规语言的范围和无上下文的范围,这意味着正则表达式不会对你有所帮助。如果XML的结构很简单(没有嵌套在节点中的节点或嵌套在引号中的引号),那么您可以在<node>(!</node>)<quote>(!</quote>)</quote>(!</node>)</node>全局替换为<node>\1\2\3</node>的情况下执行某些操作,但是您可能会使用错误的工具来完成工作。作为其他答案之一,XSLT可以帮助您,或者您可以使用XML解析库编写一个简单的程序来去除您正在寻找的标签。