Помогите с PCRE

Модератор: Модераторы разделов

Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль

Помогите с PCRE

Сообщение agent-mega »

Помогите, пожалуйста, составить выражение, описывающее первые (слева направо) восемь групп символов, разделёных (не обязательно окружённых с двух сторон (например, первая группа в начале строки)) пробелами, включая эти пробелы. Группа может состоять из одного символа.
Пример:
В строке:
asdsd asd as d asd ffgdfg a df gfghj a
Под выражение должно попасть:
asdsd asd as d asd ffgdfg a df
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите с PCRE

Сообщение t.t »

После восьмой группы пробелы всегда есть? Их включать нужно? Например, если да-да, то:
\s*([^\s]+\s+){8}
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль

Re: Помогите с PCRE

Сообщение agent-mega »

Точно, спасибо!
А {n} на конце повторяет любое выражение n раз, правильно?
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите с PCRE

Сообщение t.t »

(agent-mega @ Dec 24 2005, в 21:58) писал(а):А {n} на конце повторяет любое выражение n раз, правильно?
Если быть точным, оно повторяет последнее атомарное выражение -- потому и скобки.

Я, кстати, когда-то находил в сети хорошую русскую доку по регекспам. Если интересует, могу поискать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль

Re: Помогите с PCRE

Сообщение agent-mega »

2t.t: вы уже однажды посоветовали мне отличную доку по башу, сами знаете какую, если вы мне посоветуете подобную и по регекспам, я буду вам вдвойне благодарен :)
//в сторону: да, всё-таки мощная вещь эти регэкспы... пока сам не попробуешь, не поймёшь...
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите с PCRE

Сообщение t.t »

Увы, на этот раз я, похоже, не смогу вам помочь...
Дока эта у меня не сохранилась, а лежала она на perl.ru, который, судя по всему, почил в бозе :( Ссылку на эту доку мне дал в своё время Эндикс вот в этой теме:
http://www.linuxforum.ru/index.php?showtopic=916&hl=
А называлась она (дока), если я правильно помню, не то "Регулярные выражения Perl в примерах", не то как-то так. По именно такой фразе нашёл только одну ссылку, ведущую на тот же perl.ru... Может разве что самостоятельно что-то найдёте..
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Помогите с PCRE

Сообщение elide »

man perlre - имхо, лучшая дока по регэкспам (:
слава роботам!
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

в регулярных выражениях если осуществляется поиск статичного текста, то перл только один раз его компилит, а потом подставляет на последующих итерациях тот же результат
foreach $i (@s){
foreach my $j (@row){
$j=~s/\<\-\-IP_ADDRESS\-\-\>/$i/g;
$j=~s/\<\-\-TOTAL_BYTES_IN\-\-\>/$in_stat{$i}/g;
$j=~s/\<\-\-TOTAL_BYTES_OUT\-\-\>/$out_stat{$i}/g;
push @row1, $j;;
}
}

можно ли как то изменить это поведение (может есть директивы)?
или придется, вместо констат использовать переменные? :wacko:
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

или придется, вместо констат использовать переменные? :wacko:
[quote]

так тоже не получилось :(
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Помогите с PCRE

Сообщение madskull »

germt
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?
ArchLinux / IceWM
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

madskull писал(а):
28.04.2006 19:26
germt
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?


Чтобы регексп всегда перекомпилировался! Даже если s/<--SOME_TEXT-->/$t/
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Помогите с PCRE

Сообщение madskull »

germt писал(а):
02.05.2006 16:07
madskull писал(а):
28.04.2006 19:26

germt
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?


Чтобы регексп всегда перекомпилировался! Даже если s/<--SOME_TEXT-->/$t/

Так он и так будет перекомпилироваться. Так как используется переменная.
ArchLinux / IceWM
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

madskull писал(а):
02.05.2006 18:23
germt писал(а):
02.05.2006 16:07

madskull писал(а):
28.04.2006 19:26

germt
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?


Чтобы регексп всегда перекомпилировался! Даже если s/<--SOME_TEXT-->/$t/

Так он и так будет перекомпилироваться. Так как используется переменная.


неа не перекомпилируется :( он смотрит на констату которую ищет, и всё на этом,
вот эти строчки
foreach $i (@s){
foreach my $j (@row){
$j=~s/\<\-\-IP_ADDRESS\-\-\>/$i/g;
$j=~s/\<\-\-TOTAL_BYTES_IN\-\-\>/$in_stat{$i}/g;
$j=~s/\<\-\-TOTAL_BYTES_OUT\-\-\>/$out_stat{$i}/g;
push @row1, $j;;
}
}
выдают много раз одну и ту же строчку (в смысле для каждого нового $i он подставляет самое первое значение $i ну и соответственно $in_stat{$i} $out_stat{$i}), я смотрел print "$i $in_stat{$i} out_stat{$i} \n";
значения перебираются верные а вот регэксы подставляют одно и то же
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Помогите с PCRE

Сообщение madskull »

Попробуй добавить модификатор /e. Хотя, что-то странное творится...
ArchLinux / IceWM
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

madskull писал(а):
03.05.2006 08:49
Попробуй добавить модификатор /e. Хотя, что-то странное творится...

ето в общем пишу всё полностью, есть пример
#!/usr/bin/perl -w
use strict;
my $ipaddr="\<\-\-IP_ADDRESS\-\-\>";
my $tbi="\<\-\-TOTAL_BYTES_IN\-\-\>";
my $i;
my @s=('10', '145.34', '234');
my %in_stat=('10' => '2345', '145.34' => '65876', '234' => '69005543');
my @row=("text1 is <--IP_ADDRESS--> ok \t", "text2 is <--TOTAL_BYTES_IN--> \n");
foreach $i (@s){
foreach my $j (@row){
$j=~s/$ipaddr/$i/;
$j=~s/$tbi/$in_stat{$i}/;
print "regex string : \t $j";
}
print "real value is \t $i \t $in_stat{$i}\n\n";
}

его вывод
egex string : text1 is 10 ok regex string : text2 is 2345
real value is 10 2345

regex string : text1 is 10 ok regex string : text2 is 2345
real value is 145.34 65876

regex string : text1 is 10 ok regex string : text2 is 2345
real value is 234 69005543

ну вывод этот плохой :wacko: хотелось бы
egex string : text1 is 10 ok regex string : text2 is 2345
real value is 10 2345

regex string : text1 is 145.34 ok regex string : text2 is 65876
real value is 145.34 65876

regex string : text1 is 234 ok regex string : text2 is 69005543
real value is 234 69005543
я доки по регекспам на сайте perldoc.perl.org перелопатил (не раз вроде как) но никак найти не могу: какая комманда может вот это (как я понял нормальное) поведение (однажды откомпилить и потом подставлять) изменить (всегда компилять)

забыл
suse10 perl5 (revision 5 version 8 subversion 7) Compile-time options: DEBUGGING MULTIPLICITY USE_ITHREADS USE_LARGE_FILES PERL_IMPLICIT_CONTEXT

debian sarge perl (тот же)
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Помогите с PCRE

Сообщение madskull »

Честно говоря, я в растерянности....

Дома посмотрю.
ArchLinux / IceWM
Спасибо сказали:
Nab
Сообщения: 257

Re: Помогите с PCRE

Сообщение Nab »

Ну блин заставили старого человека с бодуна такое думать :blink: :wacko: :angry:

Проблема в том что во внутреннем цикле $j представляет реальный элемент массива @row и в первом проходе вы его изменяете... на то что выводите, соответственно для следующей иттерации совпадения не будет но значение похоже на правду...


Вот как верно

Код: Выделить всё

#!/usr/bin/perl -w
use strict;
my $ipaddr="\<\-\-IP_ADDRESS\-\-\>";
my $tbi="\<\-\-TOTAL_BYTES_IN\-\-\>";
my $i;
my @s=('10', '145.34', '234');
my %in_stat=('10' => '2345', '145.34' => '65876', '234' => '69005543');
my @row=("text1 is <--IP_ADDRESS--> ok \t", "text2 is <--TOTAL_BYTES_IN--> \n");
foreach $i (@s){
    foreach my $j (@row){
        my $g = $j;                       #Вот здесь отвязываемся от @row и все верно выводиться...
        $g=~s/$ipaddr/$i/;
        $g=~s/$tbi/$in_stat{$i}/;
        print "regex string : \t $g";
    }
    print "real value is \t $i \t $in_stat{$i}\n\n";
}
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

Nab писал(а):
03.05.2006 19:37
Ну блин заставили старого человека с бодуна такое думать :blink: :wacko: :angry:

Проблема в том что во внутреннем цикле $j представляет реальный элемент массива @row и в первом проходе вы его изменяете... на то что выводите, соответственно для следующей иттерации совпадения не будет но значение похоже на правду...


Вот как верно

Код: Выделить всё

#!/usr/bin/perl -w
use strict;
my $ipaddr="\<\-\-IP_ADDRESS\-\-\>";
my $tbi="\<\-\-TOTAL_BYTES_IN\-\-\>";
my $i;
my @s=('10', '145.34', '234');
my %in_stat=('10' => '2345', '145.34' => '65876', '234' => '69005543');
my @row=("text1 is <--IP_ADDRESS--> ok \t", "text2 is <--TOTAL_BYTES_IN--> \n");
foreach $i (@s){
    foreach my $j (@row){
        my $g = $j;                       #Вот здесь отвязываемся от @row и все верно выводиться...
        $g=~s/$ipaddr/$i/;
        $g=~s/$tbi/$in_stat{$i}/;
        print "regex string : \t $g";
    }
    print "real value is \t $i \t $in_stat{$i}\n\n";
}


я конечно извиняюсь, но ты уверен что так работает?

спасибо

спасибо

голова - два уха, недосмотрел, извиняюсь
всё пучком
и почему так тяжело понять очевидные вещи!
Спасибо сказали:
Nab
Сообщения: 257

Re: Помогите с PCRE

Сообщение Nab »

germt писал(а):
04.05.2006 08:56
я конечно извиняюсь, но ты уверен что так работает?

спасибо

спасибо

голова - два уха, недосмотрел, извиняюсь
всё пучком

Бывает :)

Можно пару комментариев и рекомендаций? --- Молчат :unsure: , ну ладно :rolleyes:

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

Достаточно часто встречается вложенные foreach и как правило я его реализую вот так, в особенности если это чистые массивы, а не ссылки или хеш:

Код: Выделить всё

foreach (@s) {
         # Сохраняю $_ потому как она будет опять же юзаться в следующем цикле
         # Хотя если она не будет изменяться то можно оставить как было...., но у меня обычно так...
    $i = $_;
        foreach (@row) {
            $j = $_;    # И вот уже с $j буду что-то делать....

Это конечно если мне надо работать и изменять значение иттератора, если нет то юзаю обычно саму $_, так проще и понятнее...

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

Код: Выделить всё

        if ($g=~s/$ipaddr/$i/ || $g=~s/$tbi/$in_stat{$i}/) {
            print "regex string : \t $g"
        }

Тогда твоя ошибка была бы очень явной....
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
germt
Сообщения: 25

Re: Помогите с PCRE

Сообщение germt »

:)
и почему так тяжело понять очевидные вещи!
Спасибо сказали: