Решено: Регулярка (perl)

Модератор: Модераторы разделов

Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win

Решено: Регулярка

Сообщение nuclear17 »

Есть регулярка $text=~m/<\s*(.+?)\s*>((.*?\n?)*)<\/\s*\1\s*>/gi

такую штуку
<? xml ?>
<test>
abchfss
</test>
<ls>
abcdfasd
</ls>
<ln>
daasdf
</ln>
<lala>abcdgs</lala>

обрабатывает секунд 30, в случае чегото такого
<? xml ?>
<test>
<t>abchfss</t>
<ls>abcdfasd</ls>
<lala>abcdgs</lala>
</test>
<test>
<t>test</t>
<ls>test2</ls>
<lala>test3</lala>
</test>
<ln>
daasdf
</ln>

вообще зависает наглухо. В чем может быть причина? заранее спасибо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Регулярка

Сообщение drBatty »

nuclear17 писал(а):
01.10.2010 09:21
Есть регулярка $text=~m/<\s*(.+?)\s*>((.*?\n?)*)<\/\s*\1\s*>/gi

хороший пример тормознутости нежадных выражений ;)
спасибо
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win

Re: Решено: Регулярка

Сообщение nuclear17 »

нашел решение путем замены (.*?\n?)* на (?s:.*?).
Вопрос номер 2 что означает ?s: ?:)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Регулярка

Сообщение NickLion »

Нежадные + * очень плохо сказываются на скорости. Замените хотя бы (.+?) на ([^>\s]+) и скорость повысится.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Регулярка

Сообщение NickLion »

(?: ) используется для группировки без выделения в \1, \2 и т.п.
(?s: ) - дополнительно флаг интерпретировать как однострочное выражение
Спасибо сказали:
Аватара пользователя
nuclear17
Сообщения: 117
ОС: linux/mac/win

Re: Решено: Регулярка

Сообщение nuclear17 »

Всем спасибо, тему можно закрывать
Спасибо сказали: