Разбор многострочного кода с C# регулярное выражение
Я работаю над классом C# для разбора BBCodes из текста, извлеченного из базы данных для сообщений PHPBB. На PHPBB добавлен пользовательский BBCode, который выглядит следующим образом:
[deck={TEXT1}]{TEXT2}[/deck]
Который, находясь в базе данных, выглядит так:
[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]
Я пытаюсь заменить это, используя регулярное выражение В C#. Мой C# выглядит так:
string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
string replace = "my replacement string";
string pattern = @"[deck=((.|n)*?)(?:s*)]((.|n)*?)[/deck(?:s*)]";
RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(text, replace);
Я почти уверен, что все сводится к тому, что мой шаблон регулярных выражений ошибочен. Что меня не удивляет, так как регулярное выражение не совсем мое сильное. подходить.
Заранее благодарю. Любая помощь очень ценится.
EDIT: поскольку некоторые люди сочли это неясным, я добавлю более крупные примеры.
Исходный текст:
[deck=Bant:13giljne]Item #1
Item #2
Item #3
Item #4[/deck:13giljne]
Желаемый результат:
<span>Bant</span>
<div>Item #1
Item #2
Item #3
Item #4</div>
Надеюсь, это даст более ясную картину того, что я пытаюсь сделать.4 ответа:
Я думаю, что ваше регулярное выражение показывает, что вам нужно сопоставить "первый текст"и" большой многострочный текст".
Это должно помочь, и это очень близко к вашему.\[deck=([^\:]+?):(?:[^\]]+)\]([^\[]+?)\[/deck:(?:[^\]]+)\]
Если вы новичок в регулярных выражениях, вы можете попробовать сопоставлять немного за один раз, чтобы убедиться, что ваша строка будет соответствовать. Например, дана строка:
string text = "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]";
Напишите выражение, соответствующее первой части:
string firstPart = "\[deck=[^\]]+\]";
[^\]]+
говорит: "сопоставьте все, что не является символом]
".Убедитесь, что он соответствует:
Match m = Regex.Match(text, firstPart);
Затем приколите вторую часть:
string firstAndSecond = firstPart + "[^\[]*";
И проверить это.
Как только это сработает, вы можете добавить последнее часть:
string search = firstAndSecond + "\[/deck[^\]]\]";
Конечным регулярным выражением будет
Я сгруппировал отдельные части, чтобы было легче их видеть. Вы можете удалить группы, если хотите, или сделать их неперехваченными.(\[deck=[^\]]+\])([^\[]+)(\[/deck[^\]]+\]
.Правка:
Я вижу из вашего редактирования, что вы хотите захватить
FirstText
и три группы:string search = "(\[deck=([^:]+):[^\]]+\])([^\[]+)(\[/deck[^\]]+\]";
Тогда строка замены будет выглядеть примерно так:
string replace = "<span>$2</span>\n<div>$3</div>";
Проверьте синтаксический анализатор STML на GitHub или Nuget. Он не использует регулярное выражение, но гораздо эффективнее и быстрее.
Если вы хотите заменить
"[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]"
, Не используйте регулярное выражение. Используйте Заменить.string result= text.Replace("[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]", replace);
Регексы обычно используются там, где строка не полностью известна, но ее структура известна.