如何使用 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 之外的所有标签,使用否定环视。让我知道这是否适用于您的场景,否则我可以进一步加强正则表达式。
我采用了一些不同的方法。
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);
不确定这是否是最好的方法,但效果很好。
我有一个问题,我应该使用什么模式来查找其他颜色标签中的所有富文本颜色标签?
例如我有这个输入:
<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 之外的所有标签,使用否定环视。让我知道这是否适用于您的场景,否则我可以进一步加强正则表达式。
我采用了一些不同的方法。
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);
不确定这是否是最好的方法,但效果很好。