Разбор многострочного кода с 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 2

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);

Регексы обычно используются там, где строка не полностью известна, но ее структура известна.