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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение всех результатов 
:(
    Опции темы
kalabro
Дата 21.1.2010, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 17.3.2007
Где: Москва

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



Доброй ночи.
Не знала, как назвать тему.

Есть строка:
Код
"Фрукты: яблоко, груша, апельсин; Автомобили: ВАЗ, УАЗ, ГАЗ;"

Хочу выбрать только все фрукты, т.е. получить массив 
Код
{"яблоко"; "груша"; "апельсин"}

Пример сильно упрошен smile
Сейчас я делаю так: ищу «Фрукты:» и первую точку с запятой после них, выделяю эту подстроку и там уже спокойненько разбираю свои фрукты, но почему-то кажется, что можно одним регулярным выражением обойтись.

Спасибо, что прочли ;)

PM MAIL ICQ Jabber   Вверх
krypt3r
Дата 21.1.2010, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

my $str = "Фрукты: яблоко, груша, апельсин; Автомобили: ВАЗ, УАЗ, ГАЗ;";
my ($fruits) = $str =~ /Фрукты:\s*(.+?);/;
my @fruits = split /,\s*/, $fruits;
print for @fruits;

PM MAIL   Вверх
kalabro
Дата 21.1.2010, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 17.3.2007
Где: Москва

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



krypt3r, такой вариант я и сама реализовала, о чем и сообщила в первом посте ;)
Вопрос в том, чтобы как-нибудь так написать регулярное выражение, чтобы сразу возвращался такой массив. Зачем? — Интересно  smile 
PM MAIL ICQ Jabber   Вверх
sir_nuf_nuf
Дата 21.1.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот так:

Код

use utf8;
my $str = "Фрукты: яблоко, груша, апельсин; Автомобили: ВАЗ, УАЗ, ГАЗ;";
my @fruits = $str =~ /\s*(\w+?)[,;](?=.*Авто)/ig;
binmode STDOUT, ":utf8";
print join " : ",  @fruits;


Вооще немного кривовато, но работает.
Операция сопоставления с регуляркой =~ вызванная в списковом контексте возвращает массив совпадающих подстрок. Это не точная формулировка, RTFM.

P.S. utf8 - можно убрать.. это для меня было


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


Опытный
**


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

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



Ну, раз интересно:
A
Код

$_ = "Фрукты: яблоко, груша,  апельсин; Автомобили: ВАЗ, УАЗ, ГАЗ;";
$, = ",";
local our @frutis; #важно - @frutis не должно быть my, либо это место должно выполнятся в программе только один раз
() = m/Фрукты:\s*(?:([^,;]*?)\s*,\s*(?{push @frutis, $^N}))*+([^,;]+)\s*;(?{push @frutis, $^N})/;
print @frutis;


B
Код

$_ = "Фрукты: яблоко, груша, апельсин; Автомобили: ВАЗ, УАЗ, ГАЗ;";
$, = ",";
print m/(?:Фрукты:|\G(?<!;))\s*([^,;]+?)\s*[,;]/g;


Это сообщение отредактировал(а) Logo - 21.1.2010, 20:30
PM MAIL   Вверх
RomanCh
Дата 13.2.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Раз уж тема создана "ради интереса", то и сроков давности она не имеет smile Вот ещё вариант, ИМХО простой, достаточно надёжный и очевидный:
Код

# Ищем элементы под именем 'need'.
$s = 'any-items: i1, i2, i3, i4; need: n1, n2, n3, n4; not-need: nn1, nn2, nn3, nn4';
$s =~ m#\bneed:\s*([^;]+)(?{@need = split /,\s*/, $1})#;
print join('|',@need),"\n";

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


 




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


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

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