如何使用 Regex 获取内部颜色标签匹配?

How to get inner color tag matches using Regex?

我有一个问题,我应该使用什么模式来查找其他颜色标签中的所有富文本颜色标签?

例如我有这个输入:

<color=yellow>Hello <color=cyan>World!</color></color>

并通过替换为空字符串匹配的标签并将其作为输入后删除:

<color=yellow>Hello World!</color>

里面可能还有更多的标签,例如:

<color=yellow>Hello my <color=cyan>name</color> is <color=gray>Kite <color=white>Watson!</color></color></color>

之后有这个:

<color=yellow>Hello my name is Kite Watson!</color>

我需要这个的原因是因为我使用 Regex 将代码荧光笔应用到文本框中的文本,并且一些关键字在注释中被着色,如下例所示

所以我想检查并删除颜色标签中是否有任何颜色标签,就像这个评论示例中一样。

我对 Regex 还很陌生,所以目前有点迷茫,不知道该怎么做。有人可以给我一些建议,告诉我如何做到这一点吗? :) 谢谢!

删除除 first 和 last 之外的所有标签,使用以下正则表达式即可获得所需内容,

(?<!^)<[^>]*>(?!$)

这基本上匹配除 first 和 last 之外的所有标签,使用否定环视。让我知道这是否适用于您的场景,否则我可以进一步加强正则表达式。

Check this Demo

我采用了一些不同的方法。

    Regex tags = new Regex(@"<color=#.*?>|<\/color>");
    MatchCollection matches = tags.Matches(c);

    bool hasStarted = false;
    int innerTags = 0;

    const string tempStart = "¬¬¬¬¬¬¬Â";
    const string tempEnd = "Â~Â~Â~Â~";
    foreach (Match match in matches)
    {
        if (match.Value.Contains("<color=#"))
        {
            if (hasStarted)
            {
                var cBuilder = new StringBuilder(c);
                cBuilder.Remove(match.Index, match.Length);
                cBuilder.Insert(match.Index, tempStart);

                c = cBuilder.ToString();

                innerTags++;
            }
            else
            {
                hasStarted = true;
            }
        }
        else if (match.Value.Equals("</color>"))
        {
            if (innerTags > 0)
            {
                var cBuilder = new StringBuilder(c);
                cBuilder.Remove(match.Index, match.Length);
                cBuilder.Insert(match.Index, tempEnd);

                c = cBuilder.ToString();

                innerTags--;
            }
            else if (innerTags <= 0)
            {
                hasStarted = false;
            }
        }
    }
    c = c.Replace(tempStart, string.Empty);
    c = c.Replace(tempEnd, string.Empty);

不确定这是否是最好的方法,但效果很好。