Mayor
Специалист
Offline
|
|
« : 01-11-2007 18:19 » |
|
транслитерация регулярного подвыражения
требуется разбить строку на список элементов, но некоторые элементы, допустим ограниченные () содержат внутри себя разделители элементов допустим _, как выполнить сплит?
* aaa_bbb_(cc_dd) --> [aaa,bbb,cc:dd]
|
|
« Последнее редактирование: 31-01-2008 03:09 от Mayor »
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 03-11-2007 21:49 » |
|
Если у тебя таких в строке не строго по одному, то порежь вторым выражением.
---
Приведи пример строки.
|
|
« Последнее редактирование: 04-11-2007 11:32 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #2 : 04-11-2007 11:59 » |
|
Приведи пример строки.
1.2.1 Услуга местного завершения вызова на узле связи сети связи другого оператора связи 73432959100 73432959300-73432959399 73432959800 73433100000-73433100999 73433101000-73433101799 (c 05.09.2007) 73433103000-73433103999 73433104000-73433105999 (c 14.09.2007) 73433106000-73433106099 73433107000-73433107099 73433107100-73433107199 73433107400-73433107799 73433107800-73433107999 (c 05.09.2007) 73433108000-73433108999 73433109000-73433109999 (c 14.09.2007) 73433219900-73433219999 73433259200-73433259499
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 04-11-2007 12:25 » |
|
#!/usr/bin/perl
@result = ();
while (<>) { for my $chunk (m/(\d{11}(?:-\d{11})?)/g) { push @result, [split(/-/, $chunk)]; } } Для "1.2.1 Услуга местного завершения..." нужно немного усложнить.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #4 : 04-11-2007 12:45 » |
|
m/(\d{11}(?:-\d{11})?)/g Для "1.2.1 Услуга местного завершения..." нужно немного усложнить. не понял части кода, в регулярных выражениях я еще слабоват ... для услуги будем надеяться что транслитерация не потребуется тк ту строку не планируется превращать в список
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 04-11-2007 12:57 » |
|
Давай подробнее... Имеем: m/(\d{11}(?:-\d{11})?)/g Модификатор 'g' - глобальный поиск. В скалярном контексте поиск вернет очередной найденный кусок текста, в списковом - список всех найденных кусков. \d{11} - цифры в количесте 11 штук. (?: ) - блок, который не приводит к захвату (образованию "кусков текста" на выходе). Полностью выражение говорит: хочу NNNNNNNNNNN или NNNNNNNNNNN-NNNNNNNNNNN. Т.к. квантификаторы по умолчанию "жадные" (тут - '?'), то второй вариант приоритетнее, но если он не складывается, то сгодится и первый. По регулярным выражениям посмотри в библиотеке: https://club.shelek.ru/viewfiles.php?id=45По самому Перлу рекомендую Programming Perl - O'Reilly (или Программирование на Perl - Символ СПб).
|
|
« Последнее редактирование: 04-11-2007 13:06 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #6 : 05-11-2007 16:50 » |
|
Полностью выражение говорит: хочу NNNNNNNNNNN или NNNNNNNNNNN-NNNNNNNNNNN. Т.к. квантификаторы по умолчанию "жадные" (тут - '?'), то второй вариант приоритетнее, но если он не складывается, то сгодится и первый.
почитаю ка я лучше perlretut, потому что все равно не понял как использовать это в проэкте да я как-то привык распечатывать электронную документацию, потому что после прочтения весьма удобно копипастить нужныные примеры да и система кроссреференсов здорово облегчает навигацию
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 05-11-2007 17:08 » |
|
Mayor1, доки доками, а книги книгами. Programming Perl написана создателем perl-а и лучшего по perl я не я не видел. Годится и начинающему и профи. В сети должна быть электронная версия на английском, а переводная есть только в бумажном виде.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #8 : 19-11-2007 13:32 » |
|
по транслитерации - все решается в 1 строчку: #!perl while(<>) { s/\([^()]+\)/my $a=$&;$a=~tr"123"abc";sprintf("-=%s=-",$a);/eg; print; }
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 19-11-2007 14:55 » |
|
Mayor1, однострочники плохи тем, что трудно читаются. Если есть возможность, лучше стараться писать ближе к классическому С-стилю, а то потом сам же будешь час разбираться, как это работает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #10 : 20-11-2007 15:24 » |
|
Mayor1, однострочники плохи тем, что трудно читаются. Если есть возможность, лучше стараться писать ближе к классическому С-стилю, а то потом сам же будешь час разбираться, как это работает. сказывается долгая работа в одного ... это вам не ядро линукса ваять где торвальдс от каждого требует исходник понятный третьекурснику по мне дак понятно и вероятность ошибок минимальна, просто на перле у меня проэкты разваливаются когда перешагивают за 150 строк ...
|
|
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 20-11-2007 15:30 » |
|
Mayor1, они потому и разваливаются, что у тебя строки ТАК выглядят )))
вот, например , я являюсь человеком рассеянным и с сумбурными мыслями (хотя, если требуется, собираюсь , естессно 0:) ) , но ты сумбурен даже с моей точки зрения! Хватаешься за всё подряд , ничего до конца не доводишь, какие то у тебя всё вопросы в кучу, какие то задачи на время ...
|
|
« Последнее редактирование: 20-11-2007 15:33 от Алексей1153++ »
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #12 : 22-11-2007 14:29 » |
|
от, например , я являюсь человеком рассеянным и с сумбурными мыслями (хотя, если требуется, собираюсь , естессно 0:) ) , но ты сумбурен даже с моей точки зрения! Хватаешься за всё подряд , ничего до конца не доводишь, какие то у тебя всё вопросы в кучу, какие то задачи на время ...
не за то что готовы заплатить я довожу до оплаты, а остальное просто делаю пока интересно, естесно интерес пропадает когда становится ясно как все сделать ... что до того, что хватаюсь за все подряд, просто мне часто дают задачи которые я не знаю как решить, нет решения нет денег, поэтому решаю сразу задачи по 3, без особой жалости отбрасывая самые бесперспективные, просто если брать по 1 задаче меня может на ней начать циклить, отчего месяц другой впустую уйдет
|
|
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 22-11-2007 14:33 » |
|
Mayor1, это всё понятно. Когда нашёл решение - тут да, немного интерес падает, но разве не охота довести программу до конца ? Или всё остаётся на бумаге ?
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #14 : 22-11-2007 14:47 » |
|
Mayor1, это всё понятно. Когда нашёл решение - тут да, немного интерес падает, но разве не охота довести программу до конца ? Или всё остаётся на бумаге ?
у меня на бумаге ничего нет, ну разве что спецификации некоторых абстрактных типов данных, да текстовые\рисованые описания нереальных алгоритмов ... просто кое что остается недоделанным кодом, который работает, но не со всеми запланированными функциями Добавлено через 69 , 12 часов, 31 минуту и 49 секунд:так следующая задачка: имеется массив заранее неизвестного размера с содержимым типа: ^7232 ^7909 ^7804 как передать управление ветви подпрограммы, если на вход подпрограммы подана строка прошедшая сличение с любым из рег выражений массива? * 7804ыва # передается управление * 1237804 # не передается зы требуется раскидать номера телефонов, на областные, федеральные сотовые и городские
|
|
« Последнее редактирование: 31-01-2008 03:19 от Mayor »
|
Записан
|
1n c0de we trust
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 31-01-2008 17:13 » |
|
Mayor1, странный вопрос. По моему задача элементарна: @prefixes = ('^7232', '^7909', '^7804');
L_prefix: for $prefix (@prefixes) { if (m/$prefix/) { // .....
last L_prefix; } } Если префиксы, по идее, можно сравнивать напрямую - без регулярных выражений. if (substr($_, 0, length($prefix)) eq $prefix) {
}
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #16 : 03-02-2008 18:19 » |
|
хм действительно элементарной оказалась, и re в данном случае никчему ... походу я прог перл не дочитал до нужной точки
|
|
|
Записан
|
1n c0de we trust
|
|
|
|