Строковое регулярное выражение с разделителями - PullRequest
1 голос
/ 20 февраля 2009

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

\[list\](.*)\[/list\]

будет заменено следующим:

<ul>$1</ul>

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

[list]list1[/list] [list]list2[/list]

становится таким:

<ul>list1[/list] [list]list2</ul>

, который производит действительно ужасный вывод. Есть идеи, как это исправить?

Ответы [ 2 ]

8 голосов
/ 20 февраля 2009

Метод, который вы используете, может оказаться не очень хорошим подходом, но для решения этой конкретной проблемы просто перейдите к сопоставлению без жадности:

\[list\](.*?)\[\/list\]

Обратите внимание, что этот способ будет иметь проблемы с вложенными списками вместо последовательных.

4 голосов
/ 20 февраля 2009

Если то, что вы делаете, не просто легкий хак, а нечто более постоянное, вы, вероятно, захотите перейти к настоящему парсеру. Регулярные выражения в Java особенно медленны (даже с предварительно скомпилированными шаблонами) и соответствуют вложенным конструкциям (особенно различным вложенным конструкциям типа "foo [u] [i] bar [s] baz [/ s] [/ s] [ / u] ") будет королевская боль.

Вместо этого попробуйте использовать синтаксический анализатор, основанный на состоянии, который многократно сокращает ваше предложение в таких разделах, как "foo" / (u) / "[i] bar [s] baz [/ s] [/ i] [/ u] "и поддерживает набор состояний, которые переворачиваются всякий раз, когда вы сталкиваетесь с соответствующим разделителем конструкций.

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