2009-02-20 3 views
1

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

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

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

<ul>$1</ul> 

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

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

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

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

, который производит действительно уродливый выход. Любая идея о том, как это исправить?

+0

Лучше постройте настоящий синтаксический анализатор, чем это псевдо-парсер регулярного выражения. По крайней мере, когда вы хотите вложенные списки, вы увидите, что регулярные выражения не являются ответом на каждый вопрос. – Gumbo

ответ

4

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

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

+0

Спасибо за советы, знаете ли вы некоторые ресурсы или рабочий пример такого анализатора? Скорость действительно является моей главной заботой ^^ – cdecker

+0

Встроенные регулярные выражения Java достаточно быстрей, если вы знаете, что делаете. Я согласен, что регулярные выражения не являются подходящим инструментом для этой работы, но производительность не является причиной. –

+0

Даже что-то так же просто, как сопоставление префикса с предварительно скомпилированным Java-выражением, очень болезненно медленное (печать всех соответствующих строк из файла с регулярным выражением типа «^ mystring»: на два порядка по сравнению с простым пуском, на порядок по сравнению с той же программой в Perl ... wtf?) – Varkhan

8

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^