我的形式有一些字符串:“[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));
}
只应从字符串中删除具有指定键的标记。我的正则表达式不起作用,因为它是愚蠢的。我需要帮助才能正确地编写它。或者,欢迎使用没有正则表达式的实现。
答案 0 :(得分:3)
我知道有更多功能丰富的工具,但我喜欢Code Architects Regex Tester(又名YART:又一个Regex Tester)的简洁性和清洁度。在树视图中显示组和捕获,非常快,非常小,开源。它还可以使用C ++,VB和C#生成代码,并且可以自动转义或取消这些语言的正则表达式。我将其转储到我的VS工具文件夹(C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ Tools)中,并在工具菜单中使用工具>设置菜单项。外部工具,所以我可以从VS内部快速启动它。
有时候正则表达式很难写,我知道能够测试正则表达式并查看结果真的很有帮助。
(来源:dotnet2themax.com)
另一个非常受欢迎(但不是免费)的选项是Regex Buddy。
答案 1 :(得分:1)
请改为尝试:
new Regex(@"\[" + tagKey + @":[^\]+]");
我唯一改变的是将+
添加到[^\]
模式,这意味着您匹配一个或多个不是反斜杠的字符。
答案 2 :(得分:1)
如果你想在没有正则表达式的情况下做到这一点并不困难。您已经在搜索特定的标记键,因此您只需搜索“[”+ tagKey,然后从那里搜索结束“]”,并删除这些偏移之间的所有内容。有点像...
int posStart = message.IndexOf("[" + tagKey + ":");
if(posStart >= 0)
{
int posEnd = message.IndexOf("]", posStart);
if(posEnd > posStart)
{
message = message.Remove(posStart, posEnd - posStart);
}
}
这比Regex解决方案更好吗?因为你只是在寻找一个特定的密钥,我认为它可能是简单的。我喜欢Regexes,但他们并不总是最清楚的答案。
编辑:IndexOf()解决方案可被视为更好的另一个原因是它意味着只有一个规则可用于查找标记的开头,而原始代码使用{{1搜索类似'[tag:'的东西,然后使用正则表达式,它使用稍微不同的表达式来进行替换/删除。从理论上讲,你可以使用符合一个标准而不是另一个标准的文本。
答案 3 :(得分:1)
我认为这是你正在寻找的正则表达式:
string regex = @"\[" + tag + @":[^\]+]\]";
此外,您无需单独检查是否有该类型的标签。只做一个正则表达式替换;如果没有匹配项,则返回原始字符串。
public static string RemoveTagWithKey(string message, string tagKey) {
string regex = @"\[" + tag + @":[^\]+]\]";
return Regex.Replace(message, regex, string.Empty);
}
您似乎正在编写扩展方法,但我将其编写为静态实用工具方法以保持简单。