Мне нужна помощь в изменении регулярного выражения C # - PullRequest
2 голосов
/ 25 февраля 2011

Я использую регулярное выражение для обнаружения тегов форума в сообщениях, таких как «[quote] текст [/ quote]», а затем заменяю их форматированием HTML. Я разместил вопрос Теги форума. Как лучше всего их реализовать? о проблеме с вложенными тегами.

У меня есть идея, но мне нужна чья-то помощь, чтобы помочь мне раскрыть ее (потому что я отстой в регулярных выражениях).

Мне нужно изменить это регулярное выражение

string regex = @"\[([^=]+)[=\x22']*(\S*?)['\x22]*\](.+?)\[/(\1)\]";

Прямо сейчас это соответствует открывающему и закрывающему тегу с группами совпадений для имени тега, содержимого тега и необязательного значения, такого как значение после равенства в этом теге форума [url=www.google.com]click me[/url].

Мне нужно, чтобы выражение совпадало с открывающим тегом ИЛИ с закрывающим тегом и имело группу соответствия, содержащую имя тега (включая '/' для закрывающего тега). Затем я хочу перебрать их примерно так:

Dictionary<string, int> tagCollection = new Dictionary<string, int>();
inputString = Regex.Replace(inputString, @"expression I'm asking for here",
match =>
{
    string tag = match.Groups[0].Value;
    bool isOpeningTag = tag.StartsWith("/");
    tag = isOpeningTag ? tag : tag.Replace("/","");
    int tagCount = 0;
    if (tagCollection.ContainsKey(tag) && isOpeningTag)
    {
        tagCount = tagCollection[tag];
        tagCollection[tag] = tagCount + 1;
    }
    else if (tagCollection.ContainsKey(tag) && !isOpeningTag)
    {
        tagCount = tagCollection[tag];
        tagCollection[tag] = tagCount - 1;
    }
    else if (!tagCollection.ContainsKey(tag) && isOpeningTag)
        tagCollection.Add(tag, tagCount);

    string newTag = match.Value.Replace(tag, tag + tagCount.ToString());
    return newTag;
});

Итак, теперь к каждому тегу добавляется число, и я мог бы использовать исходное регулярное выражение для выполнения функций тега и правильно обрабатывать вложенные теги как отдельные теги. Так что, на самом деле, все, что мне нужно от вас, ребята, это регулярное выражение, которое я перечислил, чтобы изменить его так, как я указал.

Не стесняйтесь предлагать и другие предложения, но я хотел бы попросить, чтобы фактические ответы были сосредоточены на модификации регулярного выражения, а не на том, является ли это наилучшим способом решения проблемы.

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Это может помочь вам, это парсер bbcode, который я написал некоторое время назад, чтобы в основном делать именно то, что вы делаете.

https://github.com/Mike343/Netcoders/tree/master/Coders.Services/Formatters

https://github.com/Mike343/Netcoders/blob/master/Coders.Services/Formatters/BBCodeFormatter.cs

0 голосов
/ 25 февраля 2011

\[([^=]+)[=\x22']*(\S*?)['\x22]*\]|\[/(\1)\]

...