Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Perl - Регулярные выражения / Regexpы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6

Открыть новую тему     Написать ответ в эту тему

OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Смежная тема
регулярные выражения в Perl
 
 
Было

Всего записей: 3591 | Зарегистр. 09-07-2002 | Отправлено: 03:52 30-08-2005 | Исправлено: Cheery, 18:37 27-02-2008
arreke



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да хоть вот так, в зависимости от того, что вам надо

 
чё то не помогло
требуется собственно чтобы в этом тексте
 

Код:
 
<input type='text' name='name_login' size=20 value='$_[1]'>  
<input type='text' name='name_pass' size=20 value=''$_[2]''>
 

 
вместо значений $_[...] встали значения соответствующих переменных
чтобы после вызова этой функции:
 

Код:
print_file("login.txt", "root", "blabla");

 
получить такой результат:
 

Код:
 
<input type='text' name='name_login' size=20 value='root'>  
<input type='text' name='name_pass' size=20 value=''blabla''>
 

Всего записей: 98 | Зарегистр. 11-01-2007 | Отправлено: 22:45 15-02-2009 | Исправлено: arreke, 22:53 15-02-2009
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
arreke, так сразу и надо было писать, а не абстрактно:
 

Код:
 
print_file("login.txt", "root", "blabla");  
   
sub print_file  
{  
    open F, "$_[0]" or die "Can't open $_[0] : $!";  
    while (<F>) {
        chomp;
        s/\$_\[(\d+)\]/$_[$1]/;  
        print "$_\n";  
    }  
    close F;  
}  
 



----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 23:14 15-02-2009
arreke



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt
 
Спасибо. Выручил.
Жаль нельзя плюсик за положительный ответ поставить.

Всего записей: 98 | Зарегистр. 11-01-2007 | Отправлено: 08:32 16-02-2009
arreke



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2CheRt
 
снова проблема
если в тексте переменная встречается несколько раз то второй раз она уже воспринимается не как переменная
например при таком тексте
 

Код:
 
<input type='text' name='name_login' size=20 value='$_[1]'>  
<input type='text' name='name_pass' size=20 value='$_[2]'> <input type='text' name='name_code' size=20 value='$_[1]'>  
 

 
выводит
 

Код:
 
<input type='text' name='name_login' size=20 value='root'>  
<input type='text' name='name_pass' size=20 value='blablabla'> <input type='text' name='name_code' size=20 value='$_[1]'>  
 

 
что же делать?
 
всё разобрался, просто был опущен параметр 'g', без которого заменяется только первое соответствие.

Всего записей: 98 | Зарегистр. 11-01-2007 | Отправлено: 23:09 16-02-2009 | Исправлено: arreke, 09:21 17-02-2009
altdarkstar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Парни, нужен хелп.
Ситуация - куча каталогов с css файлами, которые нужно обработать на предмет следующего:
 
В каждом файле есть примерно такой фрагмент (название одинаковое, внутренности варьируются):
 
#contentsWrap {
        background: #ffffff;
        overflow: hidden;
        width: 100%;
}
 
 
Задача - пройтись perl-ом по файлам и очистить содержимое contentsWrap (оставить чисто #contentsWrap {}).  
 
Пробовал так: 's@^#contentsWrap {(.*)}$@#contentsWrap {}@gm' - фигня получается. Подскажите плз как правильно сделать?

Всего записей: 9 | Зарегистр. 30-06-2006 | Отправлено: 04:50 01-05-2009 | Исправлено: altdarkstar, 04:50 01-05-2009
SAOD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
altdarkstar
 
s/#contentsWrap\s*{[^}]+}/#contentsWrap {}/g

Всего записей: 228 | Зарегистр. 30-12-2006 | Отправлено: 20:57 01-05-2009
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
 
s/#contentsWrap\s*{[^}]+}/#contentsWrap {}/gs
 

точнее так, т.к. без s может не захавать мультистроки

----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 22:04 01-05-2009 | Исправлено: CheRt, 22:05 01-05-2009
SAOD

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
точнее так, т.к. без s может не захавать мультистроки

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

Всего записей: 228 | Зарегистр. 30-12-2006 | Отправлено: 09:38 02-05-2009
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
SAOD, да, вы правы. Невнимательность моя


----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 11:36 02-05-2009
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помощи:
 
Есть файл, размером приблизительно 10 мегабайт.
В нём приблизительно 20000 вхождений вот таких кусков (строк)
 
Date: 19:00 21-01-2007
 
задачка такая: преобразовать строку начинающуюся именно с "Date: " в такую:
 
Date: 21 Jan 2007 19:00:00
 
Т.е. не только для января, но и для каждого месяца.
 
И вопрос ещё такой: как научиться составлять регэкспы. Т.е. с нуля.

Всего записей: 7000 | Зарегистр. 31-08-2008 | Отправлено: 14:24 27-10-2009
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ndch,

Код:
 
my %month = (
    '01' => 'Jan',
    '02' => 'Feb',
    '03' => 'Mar',
    '04' => 'Apr',
    '05' => 'May',
    '06' => 'Jun',
    '07' => 'Jul',
    '08' => 'Aug',
    '09' => 'Sep',
    '10' => 'Oct',
    '11' => 'Nov',
    '12' => 'Dec',
);
open(my $f, 'myfile');
open(my $nf, '>newfile');
while(<$f>) {
 chomp;
 s/^Date: (\d{2}:\d{2}) (\d{2})-(\d{2})-(\d{4})/Date: $2 $month{$3} $4 $1:00/;
 print $nf "$_\n";
}
close($nf);
close($f);
 


Цитата:
И вопрос ещё такой: как научиться составлять регэкспы. Т.е. с нуля.

Секретов не открою:
Цикл (пока не поймешь в достаточной мере) {
 1. Курить мануал.
 2. Смотреть примеры.
 3. Практиковать свои регэкспы.
}

----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 17:36 27-10-2009 | Исправлено: CheRt, 17:42 27-10-2009
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt
Книжку может какую посоветуешь ?
 
Добавлено:
CheRt
Книжку может какую посоветуешь ?

Всего записей: 7000 | Зарегистр. 31-08-2008 | Отправлено: 16:38 29-10-2009
rtyug



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что-то я туплю
 
хотел решить элементарную задачу
 
нужно обработать регулрным выражением 2 строки
 
есть 2 возможных варианта:
 
$hhh = 'wiki/999/44/page_co/11';
 
$hhh = 'wiki/999/1/page_co/11';
 
(цифры для примера, т.е. цифры для примера, я так понимаю (\d+))
 
почему данный код не работает?
 

Код:
 
$hhh = 'wiki/999/page_co/11';
 
# $hhh = 'wiki/999/page_co/11';
 
print $hhh =~ /^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
 
print $1.'  '.$2.'   '.$3;
 
 

 
 
мне казалось что очевидно дожно работать, но не работает....
 
в документации про ?: и т.д. как-то бредово написано

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 22:29 25-12-2009
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ndch,

Цитата:
Книжку может какую посоветуешь ?

Нет. По регэкспам я разбирался с перлдоком, не стоит его недооценивать.
 
Можно вот на русском почитать http://www.citforum.ru/internet/perl/regexp/ неплохой материал. Но по мне, так перлдок лучше.
 
rtyug,

Цитата:
в документации про ?: и т.д. как-то бредово написано

Все там нормально написано
(?модификаторы:шаблон)
средство локальной группировки, позволяет обособить, не создавая выборки + ввести отдельные локальные модификаторы.
 
 

Код:
 
my $hhh = 'wiki/999/page_co/11';  
print join(' ', $hhh =~ /^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$/ );  
 



----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 10:38 26-12-2009 | Исправлено: CheRt, 10:40 26-12-2009
rtyug



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt спасибо, я нашел уже, не увидел, просто думаю что он там не для этого...
 
 
 
это регулярное выражение в атрибут метода класса (чтобы данный метод загрузился когда идет такая url в событиях во фремворке Catalyst), там именно так и сделано, оно идет потом в массив... @$c->req->captures
 
вроде бы работает

Код:
 
sub wiki_page_co : Regex('^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$')  {  
        my ( $self, $c ) = @_;
       
      $c->stash->{ page_co } = 1;
 
# use Data::Dumper;
# print Dumper($c->req->captures);
# print $c->req->captures->[2] if (!$c->req->captures->[1]);
       
    $c->forward( 'wiki', [ !$c->req->captures->[1]  
                                ? $c->req->captures->[0]
                                : @{$c->req->captures}[0..2] ] );
     
 }
 
 

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 16:54 26-12-2009 | Исправлено: rtyug, 16:55 26-12-2009
joymix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, нужен хелп.
есть длинный текст в котором встречаются закавыченные фрагменты (причем кавычки различаются на открывающие и закрывающие. Необходимо найти и заменить фрагменты, где в в закавыченной области имеются 1, 2 или 3 слова.
Пример:
текст «слово1 слово2 слово3» прлврвдр влпрвпв  «слово1» алралр лрлы «слово1 слово2 слово3 слово4»  
После замещения должно остаться:
текст [слово1 слово2 слово3] прлврвдр влпрвпв  [слово1] алралр лрлы «слово1 слово2 слово3 слово4»  
 
 
 

Всего записей: 33 | Зарегистр. 04-03-2003 | Отправлено: 14:26 23-02-2010
pka

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
где в в закавыченной области имеются 1, 2 или 3 слова

s/\«((?:\S+\s*){1,3})\»/[$1]/g

Всего записей: 83 | Зарегистр. 16-03-2006 | Отправлено: 19:46 28-02-2010
joymix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
to PKA:
Что-то не так...
Выводит пустой текст. Что я не так сделал?
 
my $text=qq{В условиях постоянного расширения сферы компетенций Европейского Союза Брюссель как его институциональный центр стал, наряду с Вашингтоном, одним из самых значимых центров лоббирования в мире.  В марте 2005 года корреспондент «The Washington Times»  Г. Хардинг так охарактеризовал этот процесс: «В Брюсселе, столице Бельгии и центре ЕС,  немного растущих отраслей, но лоббирование явно относится к одной из них».};
$text=  s/\«((?:\S+\s*){1,3})\»/[$1]/g;
print "start<br>$text<br>end";

Всего записей: 33 | Зарегистр. 04-03-2003 | Отправлено: 22:19 28-02-2010
pka

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
$text=  s

$text =~  s/
 
Кстати, сегодня просматривал написанный мною вчера пример и заметил неточность, которая может привести к ошибке.
На коротких группах вида:
«ололо» олень «онотоле»
выражение из-за "жадности" может работать некорректно. Если такое встречается лучше использовать
$text =~ s/\«((?:[^\» ]+\s*){1,3})\»/[$1]/g

Всего записей: 83 | Зарегистр. 16-03-2006 | Отправлено: 13:12 01-03-2010 | Исправлено: pka, 13:26 01-03-2010
joymix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
to PKA.
Но ~ это я знал, это я здесь опечатался
А что касается рецепта - спасибо, вы - гений! Респект и уважуха!

Всего записей: 33 | Зарегистр. 04-03-2003 | Отправлено: 19:33 01-03-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6

Компьютерный форум Ru.Board » Интернет » Web-программирование » Perl - Регулярные выражения / Regexpы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru