C# 帮助删除标记正则表达式

C# 帮助删除标记正则表达式,c#,regex,C#,Regex,我的字符串格式为:“[user:fred][priority:3]Lorem ipsum dolor sit amet.”,其中方括号中的区域是一个标记(格式为[key:value])。我需要能够使用以下扩展方法移除特定标记(给定其密钥): public static void RemoveTagWithKey(this string message, string tagKey) { if (message.ContainsTagWithKey(tagKey)) { v

我的字符串格式为:“[user:fred][priority:3]Lorem ipsum dolor sit amet.”,其中方括号中的区域是一个标记(格式为[key:value])。我需要能够使用以下扩展方法移除特定标记(给定其密钥):

public static void RemoveTagWithKey(this string message, string tagKey) {
    if (message.ContainsTagWithKey(tagKey)) {
        var regex = new Regex(@"\[" + tagKey + @":[^\]]");
        message = regex.Replace(message , string.Empty);
    }
}
public static bool ContainsTagWithKey(this string message, string tagKey) {
    return message.Contains(string.Format("[{0}:", tagKey));
}

只应从字符串中删除具有指定键的标记。我的正则表达式不起作用,因为它很愚蠢。我需要帮助把它写好。或者,不使用正则表达式的实现是受欢迎的。

我知道还有更多功能丰富的工具,但我喜欢(又名YART:另一个正则表达式测试人员)的简单性和清洁性。在树视图中显示组和捕获,非常快速、非常小、开源。它还可以在C++、VB和C语言中生成代码,并能自动逃逸或逃脱这些语言的正则表达式。我将其转储到我的VS工具文件夹(C:\Program Files\Microsoft Visual Studio 9.0\Common7\tools)中,并在工具菜单中使用工具>外部工具为其设置一个菜单项,以便可以从VS内部快速启动它

正则表达式有时很难编写,我知道能够测试正则表达式并在运行时看到结果真的很有帮助


(来源:)

另一个非常流行(但不是免费)的选项是。

试试以下方法:

new Regex(@"\[" + tagKey + @":[^\]+]");

我唯一改变的是将
+
添加到
[^\]
模式中,这意味着您可以匹配一个或多个不是反斜杠的字符。

如果您想在不使用正则表达式的情况下实现这一点并不困难。您已经在搜索特定的标记键,因此您可以只搜索“[”+标记键,然后从那里搜索结束“]”,并删除这些偏移之间的所有内容。类似于

int posStart = message.IndexOf("[" + tagKey + ":");
if(posStart >= 0)
{
    int posEnd = message.IndexOf("]", posStart);
    if(posEnd > posStart)
    {
        message = message.Remove(posStart, posEnd - posStart);
    }
}
这比正则表达式解决方案好吗?因为你只是在寻找一个特定的键,我认为它可能是,基于简单的理由。我喜欢正则表达式,但它们并不总是最清晰的答案


Edit:IndexOf()解决方案被视为更好的另一个原因是,它意味着只有一条规则用于查找标记的开头,而原始代码使用一个
Contains()
来搜索类似[tag:'然后使用一个使用稍微不同的表达式的正则表达式来进行替换/删除。理论上,您可以有符合一个条件但不符合另一个条件的文本。

我认为这就是您要寻找的正则表达式:

string regex = @"\[" + tag + @":[^\]+]\]";
此外,您不需要单独检查是否存在该类型的标记,只需执行正则表达式替换;如果没有匹配项,则返回原始字符串

public static string RemoveTagWithKey(string message, string tagKey) {
    string regex = @"\[" + tag + @":[^\]+]\]";
    return Regex.Replace(message, regex, string.Empty);
}

您似乎正在编写一个扩展方法,但我将其作为一个静态实用程序方法来编写,以保持简单。

看起来原始问题也在试图满足标记中转义的
[
]
的要求。我最终得到了一个变体,因为我需要更多的扩展方法来处理其他内容(例如:Dictionary GetTags(此消息m)、string GetTagValue(此消息m、string tagKey)等)。重构意味着不需要正则表达式。@Drew Noakes:我不认为“Regex(@“\[”+tagKey+@):[^\]];”完全符合你的想法(可能不是手榴弹的想法!)。如果你想象tagKey是“Zippy”然后正则表达式变成“\[Zippy:[^\]]”,意思是“匹配Zippy,后跟一个冒号,后跟一个不是“]”的字符”(或者正如您在回答中所指出的,您可以在末尾加一个+使其匹配一个或多个不是“]”的字符),但这并不能巧妙地避免转义括号(使用我的mental regex解析器…)。