Regex - избавление от лишних тегов на основе определенных условий - PullRequest
0 голосов
/ 27 марта 2019

Я использую сторонний инструмент, который генерирует HTML следующим образом [это просто пример HTML-кода с длинной страницей, но шаблон тот же]:

<P>
    <SPAN>
        <SPAN>This is </SPAN>
    </SPAN>
    <SPAN STYLE="font-weight:bold;">
        <SPAN>some</SPAN>
    </SPAN>
    <SPAN>
        <SPAN> text.</SPAN>
    </SPAN>
</P>

Я хочу, чтобы он был больше cleaner следующим образом [отступ не имеет значения]:

<P>
    This is <SPAN STYLE="font-weight:bold;">some</SPAN> text.
</P>

После Regex выдает текст между тегами.Например, [span]some sample text[/span] дает мне some sample text.Но, как вы могли заметить, мой сценарий немного сложнее:

var s = "My temp folder is: [span]Path.GetTempPath()[/span]";

var result = Regex.Replace(s, @"\[span](.*?)\[/span]",
    m =>
        {
            var codeString = m.Groups[1].Value;

            // then you have to evaluate this string
            return EvaluateMyCode(codeString)
        });

1 Ответ

0 голосов
/ 28 марта 2019

Я подумал, что мне может понадобиться больше шагов, отсюда мое именование переменных, но один повторный шаблон сработал:

var p1 = new Regex(@"\s*<span>(?<text>.+?)</span>\s*", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
var s1 = src;
while (s1.IsMatch(p1))
    s1 = p1.Replace(s1, "${text}");

ПРИМЕЧАНИЕ. Если шаблон точный, вы можете сделать это без циклов, добавив квантификаторы вокругначало и конец <span> с:

var p1 = new Regex(@"(?:\s*<span>)+(?<text>.+?)(?:</span>\s*)+", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
var s1 = p1.Replace(src, "${text}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...