Помогите с PCRE
Модератор: Модераторы разделов
-
agent-mega
- Сообщения: 505
- Статус: Автономный модуль
Помогите с PCRE
Помогите, пожалуйста, составить выражение, описывающее первые (слева направо) восемь групп символов, разделёных (не обязательно окружённых с двух сторон (например, первая группа в начале строки)) пробелами, включая эти пробелы. Группа может состоять из одного символа.
Пример:
В строке:
asdsd asd as d asd ffgdfg a df gfghj a
Под выражение должно попасть:
asdsd asd as d asd ffgdfg a df
Пример:
В строке:
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
После восьмой группы пробелы всегда есть? Их включать нужно? Например, если да-да, то:
\s*([^\s]+\s+){8}
\s*([^\s]+\s+){8}
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
agent-mega
- Сообщения: 505
- Статус: Автономный модуль
Re: Помогите с PCRE
Точно, спасибо!
А {n} на конце повторяет любое выражение n раз, правильно?
А {n} на конце повторяет любое выражение n раз, правильно?
DEBIAN & DEBIAN-BASED ONLY
Всё относительно. Объективности не существует.
Всё относительно. Объективности не существует.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Помогите с PCRE
Если быть точным, оно повторяет последнее атомарное выражение -- потому и скобки.(agent-mega @ Dec 24 2005, в 21:58) писал(а):А {n} на конце повторяет любое выражение n раз, правильно?
Я, кстати, когда-то находил в сети хорошую русскую доку по регекспам. Если интересует, могу поискать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
agent-mega
- Сообщения: 505
- Статус: Автономный модуль
Re: Помогите с PCRE
2t.t: вы уже однажды посоветовали мне отличную доку по башу, сами знаете какую, если вы мне посоветуете подобную и по регекспам, я буду вам вдвойне благодарен 
//в сторону: да, всё-таки мощная вещь эти регэкспы... пока сам не попробуешь, не поймёшь...
//в сторону: да, всё-таки мощная вещь эти регэкспы... пока сам не попробуешь, не поймёшь...
DEBIAN & DEBIAN-BASED ONLY
Всё относительно. Объективности не существует.
Всё относительно. Объективности не существует.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Помогите с PCRE
Увы, на этот раз я, похоже, не смогу вам помочь...
Дока эта у меня не сохранилась, а лежала она на perl.ru, который, судя по всему, почил в бозе
Ссылку на эту доку мне дал в своё время Эндикс вот в этой теме:
http://www.linuxforum.ru/index.php?showtopic=916&hl=
А называлась она (дока), если я правильно помню, не то "Регулярные выражения Perl в примерах", не то как-то так. По именно такой фразе нашёл только одну ссылку, ведущую на тот же perl.ru... Может разве что самостоятельно что-то найдёте..
Дока эта у меня не сохранилась, а лежала она на perl.ru, который, судя по всему, почил в бозе
http://www.linuxforum.ru/index.php?showtopic=916&hl=
А называлась она (дока), если я правильно помню, не то "Регулярные выражения Perl в примерах", не то как-то так. По именно такой фразе нашёл только одну ссылку, ведущую на тот же perl.ru... Может разве что самостоятельно что-то найдёте..
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
-
germt
- Сообщения: 25
Re: Помогите с PCRE
в регулярных выражениях если осуществляется поиск статичного текста, то перл только один раз его компилит, а потом подставляет на последующих итерациях тот же результат
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;;
}
}
можно ли как то изменить это поведение (может есть директивы)?
или придется, вместо констат использовать переменные?
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;;
}
}
можно ли как то изменить это поведение (может есть директивы)?
или придется, вместо констат использовать переменные?
и почему так тяжело понять очевидные вещи!
-
germt
- Сообщения: 25
Re: Помогите с PCRE
или придется, вместо констат использовать переменные? 
[quote]
так тоже не получилось
[quote]
так тоже не получилось
и почему так тяжело понять очевидные вещи!
-
madskull
- Сообщения: 1019
- Статус: Экс-металлюга
Re: Помогите с PCRE
germt
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?
Сложно понять, что нужно-то?
Чтобы регексп всегда перекомпилировался?
Или, наоборот, при использовании переменных НЕ перекомпилировался?
ArchLinux / IceWM
-
germt
- Сообщения: 25
Re: Помогите с PCRE
Чтобы регексп всегда перекомпилировался! Даже если s/<--SOME_TEXT-->/$t/
и почему так тяжело понять очевидные вещи!
-
madskull
- Сообщения: 1019
- Статус: Экс-металлюга
Re: Помогите с PCRE
Так он и так будет перекомпилироваться. Так как используется переменная.
ArchLinux / IceWM
-
germt
- Сообщения: 25
Re: Помогите с PCRE
неа не перекомпилируется
вот эти строчки
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
Попробуй добавить модификатор /e. Хотя, что-то странное творится...
ArchLinux / IceWM
-
germt
- Сообщения: 25
Re: Помогите с PCRE
ето в общем пишу всё полностью, есть пример
#!/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
ну вывод этот плохой
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
- Статус: Экс-металлюга
-
Nab
- Сообщения: 257
Re: Помогите с PCRE
Ну блин заставили старого человека с бодуна такое думать
Проблема в том что во внутреннем цикле $j представляет реальный элемент массива @row и в первом проходе вы его изменяете... на то что выводите, соответственно для следующей иттерации совпадения не будет но значение похоже на правду...
Вот как верно
Проблема в том что во внутреннем цикле $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";
}-
germt
- Сообщения: 25
Re: Помогите с PCRE
Nab писал(а): ↑03.05.2006 19:37Ну блин заставили старого человека с бодуна такое думать![]()
![]()
![]()
Проблема в том что во внутреннем цикле $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
Бывает
Можно пару комментариев и рекомендаций? --- Молчат
Я конечно пару раз наступал в младенчестве на такие грабли, и потом выработалась устойчивая привычка сохранять значения и не менять переменную иттерацции в цикле.
Достаточно часто встречается вложенные foreach и как правило я его реализую вот так, в особенности если это чистые массивы, а не ссылки или хеш:
Код: Выделить всё
foreach (@s) {
# Сохраняю $_ потому как она будет опять же юзаться в следующем цикле
# Хотя если она не будет изменяться то можно оставить как было...., но у меня обычно так...
$i = $_;
foreach (@row) {
$j = $_; # И вот уже с $j буду что-то делать....Это конечно если мне надо работать и изменять значение иттератора, если нет то юзаю обычно саму $_, так проще и понятнее...
Ну и вот что еще... Обычно в таких конструкциях используют условия прохода приблизительно вот так:
Код: Выделить всё
if ($g=~s/$ipaddr/$i/ || $g=~s/$tbi/$in_stat{$i}/) {
print "regex string : \t $g"
}Тогда твоя ошибка была бы очень явной....
-
germt
- Сообщения: 25