代码之家  ›  专栏  ›  技术社区  ›  grenade

帮助删除标签regex

  •  2
  • grenade  · 技术社区  · 15 年前

    我有这样的字符串:“[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));
    }
    

    只能从字符串中删除具有指定键的标记。我的瑞格鞋坏了,因为它太蠢了。我需要帮助才能把它写好。或者,不使用regex的实现是受欢迎的。

    4 回复  |  直到 15 年前
        1
  •  1
  •   AAT    15 年前

    如果你想在没有regex的情况下做到这一点并不困难。您已经在搜索特定的标记键,所以您只需搜索“[”+标记键,然后从中搜索结束“]”,并删除这些偏移之间的所有内容。有点像…

    int posStart = message.IndexOf("[" + tagKey + ":");
    if(posStart >= 0)
    {
        int posEnd = message.IndexOf("]", posStart);
        if(posEnd > posStart)
        {
            message = message.Remove(posStart, posEnd - posStart);
        }
    }
    

    这比Regex解决方案更好吗?因为你只是在找一把钥匙,我想可能是因为它很简单。我喜欢正则表达式,但它们并不总是最清楚的答案。

    编辑: indexof()解决方案被认为更好的另一个原因是它意味着只有一个规则可以找到标记的开头,而原始代码使用 Contains() 它搜索类似于'[tag:'的内容,然后使用一个regex,该regex使用稍微不同的表达式进行替换/删除。理论上,你可以有符合一个标准但不符合另一个标准的文本。

        2
  •  3
  •   Dale    15 年前

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

    有时候很难编写regex,我知道能够测试regex并在执行过程中查看结果真的很有帮助。

    alt text http://www.dotnet2themax.com/blogs/fbalena/content/binary/RegexTester1.gif

    另一个非常流行(但不是免费)的选择是 Regex Buddy .

        3
  •  1
  •   Drew Noakes    15 年前

    试试这个:

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

    我唯一改变的是 + [^\] 模式,表示匹配一个或多个不是反斜杠的字符。

        4
  •  1
  •   Alan Moore Chris Ballance    15 年前

    我想这是你要找的雷杰克斯:

    string regex = @"\[" + tag + @":[^\]+]\]";
    

    另外,您不需要单独检查是否有这种类型的标签。只需执行regex替换;如果没有匹配项,则返回原始字符串。

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

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