Регулярные выражения Perl и их применение


         

секунды на миллион повторов


Итак, это регулярное выражение тратит 1. 11 секунды на миллион повторов цикла. (Кстати, на компиляцию этого регулярного выражения тратится 0.02 секунды, что намного больше, чем тратится на его выполнение для 90000 символов.)

Теперь давайте уберем атомарную группировку:

$_=' <pppp>' x 13000; $_.='<table>a'; my $re=qr /\A # начало текста (?: # цикл пропуска пробелов и тегов (?>\s*) # пропускаем пробельные символы <(?>[^>]*)> # пропускаем тег с его содержимым )* # повтор любое число раз \S # и вот он наконец - непробельный символ /x; my $t1=new Benchmark; for (1..1000000) { /$re/; } my $t2=new Benchmark; print timestr(timediff $t2,$t1);

Распечатка времени показывает, что программа стала работать быстрее и теперь тратит всего 1.08 секунды. Это можно понять так: зачем трудиться по уничтожению сохраненных состояний, когда регулярное выражение заканчивается? Если убрать атомарные скобки вокруг подшаблона \s*, то регулярное выражение начиает работать еще немного быстрее. Но здесь все зависит от данных, которые обрабатывает это регулярное выражение. В нашем случае пробелов мало, они встречаются по одному, а если группы пробелов будут большими, то в этом случае уничтожение состояний для подшаблона \s* может пригодиться. Кроме того, у нас нет возвратов при переборе. Если убрать последнюю атомарную группир овку:

/\A # начало текста (?: # цикл пропуска пробелов и тегов \s* # пропускаем пробельные символы <[^>]*> # пропускаем тег с его содержимым )* # повтор любое число раз \S # и вот он наконец - непробельный символ /x;

то время выполнения участка кода практически не изменится и станет равным 1.03 секунды.

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

(?=[^<>]*>)


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий