AppSettings标签的正则表达式删除注释的标签

时间:2018-07-06 05:14:45

标签: c# regex regular-language

我想创建一个正则表达式,该表达式应该只给我那些未注释的appsettings标记。以下是测试字符串。

<a key="a" value="b"/><b key="b" value="b"/><!--<c key="c" value="c"/>-->
<d key="d" value="d"/>

到目前为止,我已经提出了以下正则表达式。

(?<!<!--)<[^>]*/+>

我正在测试

的否定前瞻
<!--

但是它不起作用。任何想法。

1 个答案:

答案 0 :(得分:1)

这是应用垃圾桶方法的另一个好机会:我们想要的所有东西都进入了第一个捕获组,其余的都进入了整体比赛,将被完全忽略。

实现正则表达式的正则表达式如下:

<!--.*?-->|(<\s*\w+[^>]*>)

说明:

  • <!--.*?-->的第一个替换匹配HTML注释块和惰性对象之间的所有内容
  • (<\s*\w+[^>]*>)第二个匹配任何简单的XHTML标签

Demo

因此,只有在$1中有一个值时,我们才会注意到它。

Sample Code

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"<!--.*?-->|(<\s*\w+[^>]*>)";
        string input = @"<a key=""a"" value=""b""/><b key=""b"" value=""b""/><!--<c key=""c"" value=""c""/>-->
<d key=""d"" value=""d""/>";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            if(m.Groups[1].Success)
                Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

可以实现类似目的的另一种模式是利用否定性环视来声明评论标签:

(?<!<!--)(<\s*\w+[^>]*>)(?!-->)

Demo 2