Я использую регулярное выражение для обнаружения тегов форума в сообщениях, таких как «[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;
});
Итак, теперь к каждому тегу добавляется число, и я мог бы использовать исходное регулярное выражение для выполнения функций тега и правильно обрабатывать вложенные теги как отдельные теги. Так что, на самом деле, все, что мне нужно от вас, ребята, это регулярное выражение, которое я перечислил, чтобы изменить его так, как я указал.
Не стесняйтесь предлагать и другие предложения, но я хотел бы попросить, чтобы фактические ответы были сосредоточены на модификации регулярного выражения, а не на том, является ли это наилучшим способом решения проблемы.
Спасибо!