Регулярное выражение для соответствия определенным словам + содержание в скобках - PullRequest
0 голосов
/ 16 августа 2011

Я создаю почтовую систему, в которой я буду отмечать внешние изображения, Flash, SL и т. Д. С помощью [image: http://anything/anyimage.jpg] или [silverlight: http://anothersite/ilovesilverlight.xap] и т. Д.). Я буду рендерить теги объектов для HTML после найти ссылки. Я застрял с regex, я новичок в regex, поэтому, пожалуйста, будьте конструктивны, отвечая, что не так с этим:

        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 ]

3 голосов
/ 16 августа 2011

Вы можете использовать то, что называется «не жадным квантификатором», что просто означает, что он съедает столько символов, сколько может, при этом все еще сопоставляясь, в то время как стандартные (жадные) квантификаторы съедают столько символов, сколько они могут при сопоставлении.Вы сделаете квантификатор (например, * или +) нежадным, поставив после него ?:

new Regex(@"\[flash:(.+?)\]");
2 голосов
/ 16 августа 2011

Попробуйте это:

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