Регулярное выражение для тегов AppSettings Удаление закомментированных тегов - PullRequest
0 голосов
/ 06 июля 2018

Я хотел бы создать регулярное выражение, которое должно давать мне только те теги appsettings, которые не комментируются. Ниже приводится тестовая строка.

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

До сих пор я придумал следующее регулярное выражение.

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

Она тестирует негативную перспективу

<!--

но это не работает. Любая идея.

1 Ответ

0 голосов
/ 06 июля 2018

Это еще одна хорошая возможность применить мусорную корзину: все, что мы хотим, попадает в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...