代码之家  ›  专栏  ›  技术社区  ›  Charlie Salts

从XML中删除注释

  •  3
  • Charlie Salts  · 技术社区  · 16 年前

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

    <!--  Foo
    
          Bar  -->
    

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

    一个好的regex对于这个任务来说是什么?

    5 回复  |  直到 16 年前
        1
  •  5
  •   Diadistis    16 年前

    简单的方法:

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

    更好的方法是:

    Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
    
        2
  •  6
  •   yogman    16 年前

    一个也没有。它不能用正则表达式所基于的上下文无关语法来描述。

    假设这个线程是以XML导出的。您的示例(<!--foo bar-->)如果包含在CDATA中,将丢失,但它不完全是注释。

        3
  •  4
  •   Chris Nava    16 年前

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

        4
  •  0
  •   Anonymous    16 年前

    用regex分析XML被认为是错误的样式。 使用一些XML分析库。

        5
  •  0
  •   Contango    11 年前

    下面是一些完整的示例代码,用于读取XML文件,并返回一个字符串,该字符串是不带注释的文件。

    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 单靠一个人是不行的(这有点违反直觉)。