正则表达式-根据某些条件去除多余的标签

时间:2019-03-27 20:11:33

标签: c# regex

我正在使用第三方工具生成HTML,如下所示[这只是一个带有较长页面的示例html,但模式相同]:

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

我希望它更干净,如下所示[缩进无关紧要]:

<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 :(得分:0)

我以为我可能需要更多的步骤,因此我需要对变量进行命名,但是重复一种模式是可行的:

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}");