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

       

Применение объктов регулярных выражений


Объекты регулярных выражений можно применять для повышения эффективности и построения библиотек регулярных выражений, как "кирпичики". Вот пример уже рассмотренного поиска и подсветки ссылок и e-mail в тексте с использованием объектов регулярных выражений вместо интерполяции переменных:

Листинг 10.1.

(html, txt)

На печать выйдет

Листинг 10.2.

(html, txt)

Если регулярное выражение применяется неоднократно, то в качестве его "кирпичиков" лучше использовать объекты регулярных выражений, чем каждый раз интерполировать в него переменные, т.к. объекты регулярных выражений компилируются, только когда в программе выполняется оператор qr/…/.


# Оформляем ссылки без login:passw s#((?>($protocol)(?(2)(?>$ip|$host$zone)|$host$zone)(?![A-Za-z0-9])|(?<![A-Za-z0-9_\@-])(?<!\.(?!(?i:www)))$subdom$zone(?![A-Za-z0-9_.-]*\@))(?>(?>$port?(?>\@$host$zone(?![A-Za-z0-9_.-]*\@))?)?))($tail?)#$res=$2 ? '' : 'http://'; "<a href=\"$res\L$1\E$3\" target=_blank>$1$3</a>"#ge; # Оформляем ссылки с login:passw s#($protocol)($loginpasswat)($ip|$host$zone)((?>$port?)$tail?)#<a href=\"\L$1\E$2\L$3\E$4\" target=_blank>$1$2$3$4</a>"#g; # Оформляем е-мейлы. Этот оператор чувствителен к тексту, на который меняет предыдущие операторы! s#((?<!$firstchr)$firstchr(?>$namechr{0,39})\@(?>$subdom1)(?:\.$subdom1)?\.$zone)(?!(?>[^\s"<]*)(?:" target=_blank>|</a>))#<a href="mailto:$1">$1</a>#g; # Оформляем ссылки с IP s#((?<![>/])$ip(?>$port?))($tail?)#"<a href=\"http://\L$1\E$2\" target=_blank>$1$2</a>"#g;

print $_;

Листинг 10.1.

На печать выйдет

<a href="http://www.proxy.com:80@www.site.com/" target=_blank>http://www.proxy.com:80@www.site.com/</a> <a href="ftp://a.com/AAa" target=_blank>Ftp://a.com/AAa</a> <a href="ftp://Login:Passw@www.aaa.com/Www/" target=_blank>Ftp://Login:Passw@Www.Aaa.Com/Www/</a>" <a href="ftp://login:passw@a-aa.com/www/" target=_blank>Ftp://login:passw@a-aa.com/www/</a>" Mailto:<a href="mailto:aaa@sss.zzz.co">aaa@sss.zzz.co</a>. Mailto:aaa@sss.zzz.eee.co. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaa.com ыы@ddd.com ыы@ddЫ<a href="http://d.com" target=_blank>d.com</a> ыыsы-<a href="mailto:sf.ff.com.com@ddd.com">sf.ff.com.com@ddd.com</a> ыыsы.-<a href="mailto:sf.ff@ddd.com">sf.ff@ddd.com</a> Mailto:<a href="mailto:aaa@sss.co">aaa@sss.co</a>, <a href="mailto:aaa@sss.com">aaa@sss.com</a>ЫЫЫ <a href="mailto:aaa.Bb.b@aaaa.com.ru.rr">aaa.Bb.b@aaaa.com.ru.rr</a>.ggg aaa.museumm Look at:<a href="http://aaa.museum" target=_blank>aaa.museum</a>. httpS://aaa.museumm, <a href="http://www.proxy.com:80@www.site.com/" target=_blank>http://www.proxy.com:80@www.site.com/</a> <a href="http://proxy.com:80@site.com/" target=_blank>http://proxy.com:80@site.com/</a> <a href="http://proxy.com@site.com/" target=_blank>http://proxy.com@site.com/</a> <a href="http://aaaa.com.ru.rr" target=_blank>aAaa.com.ru.rr</a>.ggg <a href="http://zwww.yabcd.co.uk" target=_blank>Zwww.Yabcd.co.uk</a> Ф<a href="http://forum.abcde.ru" target=_blank>forum.abcde.ru</a> <a href="http://www.eabcd.ru" target=_blank>www.Eabcd.ru</a> <a href="http://eabcd.ru" target=_blank>http://Eabcd.Ru</a> A<a href="http://www.eabcd.ru/AAa" target=_blank>http://www.Eabcd.ru/AAa</a> <a href="http://abc.ru/query/vid.cam.dig/sony.dcrhc15.htm#full_image" target=_blank>http://abc.ru/query/vid.cam.dig/sony.dcrhc15.htm#full_image</a> Ф.<a href="http://www.abcdefg-avto.ru" target=_blank>Www.abcdefg-avto.ru</a> <a href="http://1.2.3.400/aaa/ddd.exe" target=_blank>httP://1.2.3.400/aaa/ddd.exe</a>? "<a href="http://1.2.3.400/aaa/ddd.exe?d=c,f=t;&e=h" target=_blank>1.2.3.400/aaa/ddd.exe?d=c,f=t;&e=h</a>", ."<a href="http://0.2.3.400" target=_blank>0.2.3.400</a>". <a href="http://66.123.234.555/ddd" target=_blank>http://66.123.234.555/ddd</a> <a href="mailto:michel@ab-cdefg.ru">michel@ab-cdefg.ru</a> <a href="http://99.999.999.999/search?q=cache:w5K8GsupwvcJ:olympus.flexiblesoft.com/c-4000-man.doc+c-4000-man&hl=ru&client=firefox-a" target=_blank>http://99.999.999.999/search?q=cache:w5K8GsupwvcJ:olympus.flexiblesoft.com/c-4000-man.doc+c-4000-man&hl=ru&client=firefox-a</a>

Листинг 10.2.

Если регулярное выражение применяется неоднократно, то в качестве его "кирпичиков" лучше использовать объекты регулярных выражений, чем каждый раз интерполировать в него переменные, т.к. объекты регулярных выражений компилируются, только когда в программе выполняется оператор qr/…/.

© 2003-2007 INTUIT.ru. Все права защищены.

Содержание раздела