我想创建一个正则表达式,该表达式应该只给我那些未注释的appsettings标记。以下是测试字符串。
<a key="a" value="b"/><b key="b" value="b"/><!--<c key="c" value="c"/>-->
<d key="d" value="d"/>
到目前为止,我已经提出了以下正则表达式。
(?<!<!--)<[^>]*/+>
我正在测试
的否定前瞻<!--
但是它不起作用。任何想法。
答案 0 :(得分:1)
这是应用垃圾桶方法的另一个好机会:我们想要的所有东西都进入了第一个捕获组,其余的都进入了整体比赛,将被完全忽略。
实现正则表达式的正则表达式如下:
<!--.*?-->|(<\s*\w+[^>]*>)
说明:
<!--.*?-->
的第一个替换匹配HTML注释块和惰性对象之间的所有内容(<\s*\w+[^>]*>)
第二个匹配任何简单的XHTML标签因此,只有在$1
中有一个值时,我们才会注意到它。
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+[^>]*>)(?!-->)