Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > вопрос по регулярным выражениям


Автор: gcc 20.2.2010, 10:57
1) подскажите, что тут означет знак '#' "решетка" и '\1' и '\s*'?

Код

        $var_value =~ s#^\s*(['"]?)(.*)\1#$2#;



2) а скажите кто видел задачки практические по рег. выр. ? просто хочется знать как применять их в разные случаях...
 я делал только то что мне нужно было, но что-то я многое незнаю как применить по рег. выр. или это не нужно?

в гугле не нашел

http://www.google.com.ua/#hl=uk&q=%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B8+%D0%BF%D0%BE+%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%BC+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC+perl&meta=&aq=&oq=%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B8+%D0%BF%D0%BE+%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%BC+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC+perl&fp=f37666c956da6ac9

Автор: Egik2 20.2.2010, 11:16
Цитата(gcc @  20.2.2010,  10:57 Найти цитируемый пост)
1) подскажите, что тут означет знак '#' "решетка" и '\1' и '\s*'?


# - используется вместо стандартного разделителя /, то есть одно и то же:
s/bla/bla/ и s#bla#bla

\1 - будет содержать первое "пойманное" скобками значение, если ты хочешь его использовать дальше в регекспе, то есть, в твоем случае:
Код

$var_value =~ s#^\s*(['"]?)(.*)\1#$2#;

это будет
 
Код

['"]?


\s* означает 0 или более разделительных символов.

Добавлено через 6 минут и 23 секунды
Если хочешь почитать что-нить по регекспам, то очень помогает, если не читал раньше
Программирование на Perl от самого Ларри Волла и друзей. Основополагающая книга по Perl, и 
регулярные выражение описаны великолепно  smile 
Еще можно:
Фридл Дж. Регулярные выражения (2-е изд.), Питер 2003, 464 с., ISBN 5-272-00331-4
Правда у меня у самого руки до нее не дошли пока  smile 

Автор: gcc 20.2.2010, 19:24
Egik2, 
Программирование на Perl  - эта книжка по-моиму слабая, я много книг читал таких и на английском смотрел, тоже
мощные на русском книги, вот эти  2-3 издание "Рецепты для профессионалов"

посмотрю еще вашу....

НО все таки для разных задач нужно абсолютно по разному писать рег. выр.

документацию я читал много раз, но не всегда понимаю как оно должно следовать в разные ситуациях!!!!


======

а подскажите что значит эта опция   -0x0a  ? и какие еще есть опции похожие ?

Код

perl -MData::Dumper -0x0a -lne ' $hash->{$1}++ while $_ =~ /from=\<([\w+\-\.]+\@[\w\-\.]+\.\w{2,3})(.*)\>/smg; END { print Dumper $hash }' /var/log/maillog



=====


еще есть одно наверное сложное регулярное выражение:

у меня есть в тексте 


Код

http://www.ggg.com
[URL]http://www.ggg.com[/URL]
[URL=http://www.ggg.com]ннннн[/URL]


нужно рег. выраджение которые преобразует это все в тексте в вид html 
перевести с BB в HTML

Код

<a href="http://www.ggg.com"> df </a>


я не понимаю как это сделать?

Автор: Logo 21.2.2010, 17:11
Код

$_ = q{
http://www.ggg.com
[URL]http://www.ggg.com[/URL]
[URL=http://www.ggg.com]ннннн[/URL]
};

s{
  (?<name>(?<url>\bhttps?://[\w-]+ (?:\.[\w-]+)* (?:\.\w+)? (?:/.*?(?=[.,?]?(?:\s|$)))?  )) |
  \[URL\](?<name>(?<url>(?s:.*?)))\[/URL\] |
  \[URL=(?<url>[^\]]*)\](?<name>(?s:.*?))\[/URL\]
}
{<a href="$+{url}">$+{name}</a>}xg;

print;


Цитата

Фридл Дж. Регулярные выражения (2-е изд.), Питер 2003, 464 с., ISBN 5-272-00331-4

Да, хорошая книга. С осени уже 3-е издание на русском. Правда про Perl там раздел не обновлен, а для понимания принципов и 2-ого достаточно.

Автор: gcc 21.2.2010, 17:46
Logo, 

спасибо, как-то так наверное можно...

но у меня не работает

Код

./yy.pl
Sequence (?<n...) not recognized in regex; marked by <-- HERE in m/
  (?<n <-- HERE ame>(?<url>\bhttps?://[\w-]+ (?:\.[\w-]+)* (?:\.\w+)? (?:/.*?(?=[.,?]?(?:\s|$)))?  )) |
  \[URL\](?<name>(?<url>(?s:.*?)))\[/URL\] |
  \[URL=(?<url>[^\]]*)\](?<name>(?s:.*?))\[/URL\]
/ at ./yy.pl line 20.



Код

 perl -v

This is perl, v5.8.9 built for i386-freebsd-64int
(with 1 registered patch, see perl -V for more detail)




Автор: Logo 21.2.2010, 18:14
5.8 потому что...
Тогда так должно работать.
Код

#!/usr/bin/perl

$_ = q{
http://www.ggg.com
[URL]http://www.ggg.com[/URL]
[URL=http://www.ggg.com]ннннн[/URL]
};

s{
  (\bhttps?://[\w-]+ (?:\.[\w-]+)* (?:\.\w+)? (?:/.*?(?=[.,?]?(?:\s|$)))?  ) |
  \[URL\]((?s:.*?))\[/URL\] |
  \[URL=([^\]]*)\]((?s:.*?))\[/URL\]
}
{
  $1 ? "<a href=\"$1\">$1</a>" :
  $2 ? "<a href=\"$2\">$2</a>" :
       "<a href=\"$3\">$4</a>"
}exg;

print;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)