Это еще одна хорошая возможность применить мусорную корзину: все, что мы хотим, попадает в 1-ю группу захвата, остальное входит в общий матч и будет полностью проигнорировано.
Регулярное выражение, которое достигает только того, что может выглядеть следующим образом:
<!--.*?-->|(<\s*\w+[^>]*>)
Пояснение:
<!--.*?-->
первое чередование соответствует блокам комментариев HTML и всему, что находится между lazy
(<\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+[^>]*>)(?!-->)
Демо 2