LINUX.ORG.RU

[Perl] помогите написать регулярное выражение


0

0

Здравствуйте.
У меня пока мало опыта в Perl. Но стала задача обработать огромный объем текста, и я решил, что лучше день потерять (понять как работает Perl) чем делать то же вручную.
Есть текст следующего вида (список организаций):
name=«данные».adress=«данные»,phone=«данные»<BR>
name=«данные».adress=«данные»,phone=«данные»,phone=«данные,phone=„данные<BR>
name=„данные“.adress=„данные“,phone=„данные“,phone=„данные“

Т.е. в исходных данных интересующие меня записи расположены последовательно, но поле phone может встречаться 1,2 или 3 раза. Хочу организовать из этого таблицу, такую:
name | adress | phone1 | phone2 | phone3
Нужно подобрать шаблон, который позволит учесть, что phone может встретиться 1-3 раза для каждой записи.
Ну вот, например,
@list = $content ~= m{name=“(*.?)»,adress="(*.?)",phone1="(*.?)«}gs

Как быть со вторым и третьим телефоном, не знаю.

Ответ на: комментарий от philosoft

> @list = $content ~= m{name="(*.?)",adress="(*.?)",phone1="(*.?)«}gs

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

my @list=(); my %info=(); while($content=~/((name|adress|phone)=»(.*?)"(?{$info{$2}=!exists $info{$2}?[$3]:[@{$info{$2}},$3]}).+?)+/g){ push(@list,join(«|»,@{$info{'name'}},@{$info{'adress'}},@{$info{'phone'}})); %info=(); }

simple_best_world_web_master ()
Ответ на: комментарий от r_asian

Я потратил свое время, написал скрипт, отладил, бесплатно выложил (а на фрилансе такое говно баксов 20 стоит), можно сказать подарил обществу, за что именя и облили помоями.

Скотина ты неблагодарная, стыда совсем нет

simple_best_world_web_master ()

Как-то так.

name="(.*?)«\.adress=»(.*?)"(?:\,phone="(.*?)")+

(?: ) — это кластеризация без захвата. + в конце указывает, что секция может встречаться 1 ии более раз.

ivano ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.