Разверните петлю, когда использовать

Я пытаюсь понять развернутые циклы в регулярных выражениях. В чем большая разница между:

MINISTÉRIO[\s\S]*?PÁG

а также

MINISTÉRIO(?:[^P]*(?:P(?!ÁG\s:\s\d+\/\d+)[^P]*)(?:[\s\S]*?))PÁG

В данном контексте:

http://regexr.com/3dmlr

Почему я должен использовать второй, если первый делает то же самое?

Благодарю.

 melpomene24 июн. 2016 г., 18:38
Они не делают то же самое. Почему вы думаете, что они делают?
 user552681124 июн. 2016 г., 18:39
Можете ли вы проверить оба в ссылке, которую я предоставляю? Можете ли вы объяснить мне разницу? Как развернуть петли можно использовать? Для каких целей? Спасибо!!!
 melpomene24 июн. 2016 г., 18:44
Первый соответствуетMINISTÉRIO PÁGвторой нет. Я не знаю, что вы подразумеваете под "развернуть петли".

Ответы на вопрос(1)

Решение Вопроса
Что такое Unroll-the-loop

Видеть этоРазверните технику петли источник:

Эта методика оптимизации используется для оптимизации многократного чередования форм.(expr1|expr2|...)*, Эти выражения не редкость, и использование другого повторения внутри чередования может также привести к суперлинейному соответствию. Суперлинейное совпадение возникает из недетерминированного выражения(a*)*.

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

нормальный * (особый нормальный *) *

Итак, этометодика оптимизации где чередования превращаются в линейно совпадающие атомы.

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

Текущий сценарий

ВашMINISTÉRIO[\s\S]*?PÁG это развернутый шаблон, в то время какMINISTÉRIO[^P]*(?:P(?!ÁG)[^P]*)*PÁG является. Посмотрите демонстрации (обе сохранены с опцией PCRE, чтобы показать количество шагов в поле выше. Производительность регулярных выражений различна для разных механизмов регулярных выражений, но это точно скажет вам разницу в производительности). Добавить больше текста послеtext: первое регулярное выражение будет требовать больше шагов для завершения, второе будет только больше шагов после добавленияP, Так,в текстах, где символ, который вы использовали визвестен часть не распространена, развернутые шаблоны очень эффективны.

УвидетьРазница между.*?, .* а также[^"]*+ кванторы раздел в моем ответе, чтобы понять, как работает ленивое соответствие (ваш[\s\S]*? такой же как.*? с модификатором DOTALL в языках, которые позволяют. соответствовать новой строке тоже).

Вопрос производительности

Всегда ли ленивый шаблон сопоставления всегда медленный и неэффективный? Это не всегда так. При очень коротких строках сопоставление ленивых точек обычно лучше (1-10 символов). Когда мы говорим о длинных входных данных, где может быть ведущий разделитель, а не конечный, это может привести к чрезмерному обратному отслеживанию, что приведет к проблемам с тайм-аутом.

Используйте развернутые шаблоны, когда у вас есть произвольные входы потенциально большой длины и где может не быть совпадения.

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

Бонус: обычно развернутые шаблоны

Закаленные жадные жетоны

Обычные строковые литералы ("String\u0020:\"text\""):"[^"\\]*(?:\\.[^"\\]*)*"

Многострочный комментарий регулярное выражение (/* Comments */):/\*[^*]*\*+(?:[^/*][^*]*\*+)*/

@<...>@ комментарий регулярное выражение:@<[^>]*(?:>[^@]*)*@

 user552681124 июн. 2016 г., 18:56
Теперь я понял! Спасибо, Виктор! :)
 Wiktor Stribiżew24 июн. 2016 г., 18:59
Я добавил больше. Как правило, поведение аналогично: развернутые шаблоны работают быстрее и надежнее, так как они выходят из строя гораздо более изящно, когда шаблон не соответствует строке.
 user552681124 июн. 2016 г., 19:03
Хорошо. Большое спасибо за ваше распоряжение

Ваш ответ на вопрос