LINUX.ORG.RU

регулярка


0

1

Есть регулярка $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>

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



Последнее исправление: kote (всего исправлений: 2)

Может быть, стоит не мучить себя и PCRE и воспользоваться xml-парсером?

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

Впрочем, ваши данные - невалидный xml. В приведенных примерах, правда, это можно легко исправить.

shylent
()

Например, в том, что число способов сопоставления с выражением (.*?\n?)* экспоненциально от длины строки.

TempestAdept
()
Ответ на: комментарий от kote

(?s) как и /s - это dotall option. Позволяет захватывать знаком "." символы \n.

hunt
()

Заинтересовало, решил отдебажить:

perl -Mre=debug -lne 'print /<\s*(.*?\n?)\s*>((?s:.*?))<\/\s*\1\s*>/gi' test 2> debug_with_s

debug_with_s 72.6 кб

perl -Mre=debug -lne 'print /<\s*(.*?\n?)\s*>((.*?\n?)*)<\/\s*\1\s*>/gi' test 2> debug_without_s

ещё молотит, но debug_without_s уже 4.8 гб. %)

hunt
()

Причина в кривой реализации перловых регэкспов через бектрекинг а не трансляцию в конечные автоматы.

Legioner ★★★★★
()

m/<\s*([\w:-]+)[^>]*>([^<]*)<\/\s*\1\s*>/g

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.