【问题标题】:Strip Comments from XML从 XML 中删除注释
【发布时间】:2010-09-28 14:16:05
【问题描述】:

我遇到了需要删除表单的cmets:

<!--  Foo

      Bar  -->

我想使用一个正则表达式来匹配开头和结尾“分隔符”之间的任何内容(包括换行符)。

对于这项任务,一个好的正则表达式是什么?

【问题讨论】:

    标签: .net regex comments strip


    【解决方案1】:

    无。它不能用正则表达式所基于的上下文无关文法来描述。

    假设这个线程以 XML 格式导出。如果包含在 CDATA 中,您的示例 () 将丢失,但它并不完全是评论。

    【讨论】:

      【解决方案2】:

      简单的方法:

      Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);
      

      还有一个更好的方法:

      Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
      

      【讨论】:

      • 对于我的简单测试用例, 等价于我自己的: 我的有什么遗漏吗?
      • 只有性能不同。根据我的测试,你的需要 118 步才能完成,而我的需要 62 步:)
      • 我不知道 .net 的正则表达式库,但许多正则表达式编译器都对 .*? 进行了优化?所以它比天真的情况要快得多
      【解决方案3】:

      “正确”的方法是使用 XSLT 并复制除 cmets 之外的所有内容。

      【讨论】:

      • 我在 XSLT 方面没有太多经验 - 但这是我将来可能会尝试的东西。
      【解决方案4】:

      使用正则表达式解析 XML 被认为是不好的风格。 使用一些 XML 解析库。

      【讨论】:

        【解决方案5】:

        这是一些完整的示例代码,用于读取 XML 文件,并返回一个字符串,该字符串是没有 cmets 的文件。

        var text = File.ReadAllText("c:\file.xml");
        { 
          const string strRegex = @"<!--(?:[^-]|-(?!->))*-->";
          const RegexOptions myRegexOptions = RegexOptions.Multiline;
          Regex myRegex = new Regex(strRegex, myRegexOptions);
          string strTargetString = text;
          const string strReplace = @""; 
        
          string result = myRegex.Replace(strTargetString, strReplace);
          return result;
        }
        

        不幸的是,单独使用RegexOptions.Multiline 无法解决问题(这有点违反直觉)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-26
          • 2014-06-27
          • 2023-02-01
          • 2023-01-16
          • 2015-02-01
          • 2019-06-06
          • 2018-04-13
          • 1970-01-01
          相关资源
          最近更新 更多