Разбор многострочного BBCode с C # Regex - PullRequest
2 голосов
/ 15 ноября 2011

Я работаю над классом 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);

Я почти уверен, что все сводится к тому, что мой шаблон Regex неверен.Что неудивительно для меня, так как Regex не совсем мой сильный костюм.

Заранее спасибо.Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: Поскольку некоторые люди нашли неясным, я добавлю более крупные примеры.

Исходный текст:

[deck=Foo:13giljne]
    Item #1
    Item #2
    Item #3
    Item #4
[/deck:13giljne]

Желаемый результат:

<span>Foo</span>
<div>
    Item #1
    Item #2
    Item #3
    Item #4
</div>

Надеюсь, это даст более четкое представление о том, что я пытаюсь сделать.

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Я думаю, ваше регулярное выражение показывает, что вам нужно сопоставить «Первый текст» и «Большой многострочный текст».

\[deck=([^\:]+?):(?:[^\]]+)\]([^\[]+?)\[/deck:(?:[^\]]+)\]

Это должно помочь, и оно очень близко к вашему.

1 голос
/ 15 ноября 2011

Если вы новичок в регулярных выражениях, вы можете попытаться сопоставить немного за раз, чтобы быть уверенным, что ваша строка будет соответствовать. Например, с учетом строки:

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[^\]]+\].

Я сгруппировал отдельные части, чтобы их было легче увидеть. Вы можете удалить группы, если хотите, или сделать их без захвата.

EDIT:

Я вижу из ваших правок, что вы хотите захватить FirstText и три группы:

string search = "(\[deck=([^:]+):[^\]]+\])([^\[]+)(\[/deck[^\]]+\]";

Строка замены будет выглядеть примерно так:

string replace = "<span>$2</span>\n<div>$3</div>";
0 голосов
/ 07 января 2015

Проверьте STML Parser на GitHub или Nuget. Он не использует RegEx, но он намного эффективнее и быстрее.

enter image description here

0 голосов
/ 15 ноября 2011

Если вы хотите заменить "[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]", не используйте регулярные выражения.Используйте Replace.

string result= text.Replace("[deck=FirstText:13giljne]Large Multiline Text[/deck:13giljne]", replace);

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

...