Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, Обращение к части регулярного выражения 
:(
    Опции темы
dron000
Дата 13.5.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



После поиска очередной строки осуществляю вывод,во втором и в третьем случае выводится первое значение.
Как это обойти?

Код


$res =~s/Последовательность1[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "Послед1--->\n".$1;

$res =~s/Последовательность2[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "Послед2--->\n".$1;

$res =~s/Последовательность3[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "Послед3--->\n".$1;


PM MAIL   Вверх
sir_nuf_nuf
Дата 13.5.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



В каком смысле первое ? 
все операторы print печатают одно и то же ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
dron000
Дата 13.5.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



В данном случае да.
PM MAIL   Вверх
sir_nuf_nuf
Дата 13.5.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



странно - у меня все работает адекватно. 
Код

$res = "p1 zz=01234567898 p3 33344455577 p2gggg=ggg55566677722 p1=222233334444";
$res =~s/p1[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "str='$res' matched='$1'\n";
$res =~s/p2[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "str='$res' matched='$1'\n";
$res =~s/p3[\sa-zA-Z=]*(\d{9,})/$1/ig;
print "str='$res' matched='$1'\n";


[nuf@nuftop /usr/home/nuf/study]$ perl 1.pl
str='01234567898 p3 33344455577 p2gggg=ggg55566677722 222233334444' matched='222233334444'
str='01234567898 p3 33344455577 55566677722 222233334444' matched='55566677722'
str='01234567898 33344455577 55566677722 222233334444' matched='33344455577'

Может это особенность ваших входных данных ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
dron000
Дата 14.5.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Проверял в разных вариациях, почлучается что если мы нашли комбинацию то в следующих выводах выводится она же, если нашли новую то далее в выводах идет уже она. p1,p2,p3 у меня разные и частями друг друга не являются, в этом смысле повтор исключен.

Добавлено через 13 минут и 26 секунд
Такое происходит только тогда когда например  для p1 найдено а для p2 нет(тогда на выводе для p2, $1 ,будет такой же как для p1 пока не будет найдено новое Pn ),можно ли $1 как-то очищать?(потому как не для каждого p находится последовательность удовлетворяющая шаблону) 
PM MAIL   Вверх
amg
Дата 14.5.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(dron000 @  14.5.2009,  09:27 Найти цитируемый пост)
Такое происходит только тогда когда например  для p1 найдено а для p2 нет(тогда на выводе для p2, $1 ,будет такой же как для p1 пока не будет найдено новое Pn ),можно ли $1 как-то очищать?(потому как не для каждого p находится последовательность удовлетворяющая шаблону) 
Вы совершенно верно подметили, $1 не ресетится после "неудачного" регулярного выражения. Хорошо это или плохо -- вопрос, но так оно есть. Просто нужно привыкнуть всегда писать так:
Код
if ($res =~s/Последовательность1[\sa-zA-Z=]*(\d{9,})/$1/ig) {
  print "Послед1--->\n".$1;
}
# Либо
$res =~s/Последовательность1[\sa-zA-Z=]*(\d{9,})/$1/ig &&
print "Послед1--->\n".$1;

PM MAIL   Вверх
dron000
Дата 14.5.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



СПАСИБО!!!Работает.
PM MAIL   Вверх
shamber
Дата 14.5.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



Цитата(amg @  14.5.2009,  10:19 Найти цитируемый пост)
if ($res =~s/Последовательность1[\sa-zA-Z=]*(\d{9,})/$1/ig) {
  print "Послед1--->\n".$1;
}

Забавно, я такое интуитивно писал smile
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.