正则表达式匹配括号内的特定单词+内容

时间:2011-08-16 18:21:46

标签: c# regex regex-negation

我正在创建一个帖子系统,我将使用[image:http://anything/anyimage.jpg]或[silverlight:http://anothersite/ilovesilverlight.xap]标记外部图像,Flash,SL等等等。我将在找到链接后呈现HTML的对象标签。我坚持使用正则表达式,我对正则表达式很陌生,所以请在回答时保持建设性,这有什么问题:

        if (text.Contains("[flash:"))
        {
            rgx = new Regex(@"\[flash:(.^\])\]");
            text = rgx.Replace(text, (m =>
            {
                string val = m.Groups[1].Value;
                FlashRenderer ir = new FlashRenderer(val);
                return ir.Render();
            }));
        }

忘记FlashRenderer及其返回的内容,我的问题在于匹配。 我进入if块,但找不到与正则表达式匹配的任何实例,尽管我有。我可以在一个帖子中有多个外部对象,所以我要做的是否定匹配中的]字符。如果我不否定],如果我在任何地方只有一个对象而没有其他]个字符就没有问题,但如果我有更多]个,那么一切都搞砸了因为第一个正则表达式匹配整个帖子中]的最后一次出现,并将整个帖子的其余部分作为所谓的“URL”返回。

2 个答案:

答案 0 :(得分:3)

你可以使用所谓的“非贪婪量词”,这意味着它在仍然匹配的同时吃尽可能少的字符,而默认(贪婪)量词尽可能多地吃掉仍然匹配的字符。您可以通过在*之后添加+来使量词(如?new Regex(@"\[flash:(.+?)\]"); )非贪婪:

{{1}}

答案 1 :(得分:2)

试试这个:

new Regex(@"\[flash:([^\]]+)\]");
\[flash:          # prefix
  (               # capture group
      [^\]]+      # one or more characters except ]
  )               #
\]                # suffix