The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Применение условий замены в регулярном выражении"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Языки программирования)
Изначальное сообщение [ Отслеживать ]

"Применение условий замены в регулярном выражении"  +/
Сообщение от St.Wepricki (ok) on 06-Авг-13, 15:39 
Добрый день!

Есть такая проблема.

Надо обрабатывать записи с телефонными номерами, приводя их к виду:

если номер начинается с 7, то заменить 7 на 98
иначе
дописать номер к 9810.

Т.е., примерно так:

if($phone =~ /^7/)
{
$phone =  =~ s/^[7]/98/;
}
else
{
$phone = "9810".$phone;
}

Возможно ли данную процедуру реализовать через одно единственное регулярное выражение с условием?

Спасибо.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Применение условий замены в регулярном выражении"  +/
Сообщение от Аноним (??) on 06-Авг-13, 18:13 
Откройте для себя встроенную переменную "$_"
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Применение условий замены в регулярном выражении"  +1 +/
Сообщение от XAnder (ok) on 06-Авг-13, 18:14 
Можно загнать ветвление внутрь s/// прямо:

s/^(7?)/$1==7 ? "98" : "9810"/e;

Или более извращённо:

$n="10"; s/^(7(?{$n=""}))?/98$n/;

А можно и двумя операторами:

s/^(?!7)/9810/; s/^7/98/;

По-моему так проще.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Применение условий замены в регулярном выражении"  +/
Сообщение от михалыч (ok) on 07-Авг-13, 05:06 
#!/usr/bin/perl

$phone=(<>);
$phone=~s/^(\d)(\d*)/if($1==7){"98$2"}else{"9810$1$2"}/e;
print $phone;

Тьфу! Это же вид сбоку всем известного предмета предыдущего варианта. Тупо проглядел.))

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Применение условий замены в регулярном выражении"  +/
Сообщение от Andrey Mitrofanov on 07-Авг-13, 08:25 
> #!/usr/bin/perl
> if($1==7){"98$2"}else{"9810$1$2"}
> Тьфу! Это же вид сбоку всем известного предмета предыдущего

У меня глаза болят на ваши примеры. Про перл помолчу, но "98" могли бы за "скобки" if вынести. Как и $2.

"98"if($1!=7){"10$1"}"$2" ?

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Применение условий замены в регулярном выражении"  +/
Сообщение от михалыч (ok) on 07-Авг-13, 10:17 
>> #!/usr/bin/perl
>> if($1==7){"98$2"}else{"9810$1$2"}
>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
> могли бы за "скобки" if вынести. Как и $2.
> "98"if($1!=7){"10$1"}"$2" ?

XAnder с тернарным условным оператором уже всё сказал.
И другие его примеры не хуже.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Применение условий замены в регулярном выражении"  +1 +/
Сообщение от ACCA (ok) on 07-Авг-13, 22:28 
>>> #!/usr/bin/perl
>>> if($1==7){"98$2"}else{"9810$1$2"}
>>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
>> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
>> могли бы за "скобки" if вынести. Как и $2.
>> "98"if($1!=7){"10$1"}"$2" ?

Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в regex вообще?

$phone = "9810".$phone;
$phone =~ s/^98107/98/;


Или на Perl:

$phone = '9810'.$phone  unless $phone =~ s/^7/98/;

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "Применение условий замены в регулярном выражении"  +/
Сообщение от михалыч (ok) on 08-Авг-13, 05:06 
>[оверквотинг удален]
>>>> Тьфу! Это же вид сбоку всем известного предмета предыдущего
>>> У меня глаза болят на ваши примеры. Про перл помолчу, но "98"
>>> могли бы за "скобки" if вынести. Как и $2.
>>> "98"if($1!=7){"10$1"}"$2" ?
> Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в
> regex вообще?
> $phone = "9810".$phone;
> $phone =~ s/^98107/98/;
> Или на Perl:
> $phone = '9810'.$phone  unless $phone =~ s/^7/98/;

Не стесняйся!))
Ну что тут скажешь? Класс! Аплодисменты, переходящие в овации. Занавес!?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Применение условий замены в регулярном выражении"  +/
Сообщение от XAnder (ok) on 08-Авг-13, 12:56 
> Стесняюсь спросить, а нафига для этой задачи тернарные операторы и условия в
> regex вообще?
> $phone = "9810".$phone;
> $phone =~ s/^98107/98/;
> Или на Perl:
> $phone = '9810'.$phone  unless $phone =~ s/^7/98/;

Свежо! Но это всё (у всех, кто здесь что-либо предложил) разные варианты реализации одной и той же идеи. Выбор операторов - дело десятое, а условия всегда есть, поскольку рег. выражения, по сути, из них и состоят.

Я вот жду, не предложит ли кто-нибудь решение _только единственным_ s/// без вставок кода через /e или (?{}). Думаю, что такое решение или не существует, или слишком громоздко. Практической пользы тут нет, но почему бы и не порешать в качестве "гимнастики ума"?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Применение условий замены в регулярном выражении"  +/
Сообщение от ACCA (ok) on 11-Авг-13, 21:36 
>> $phone = "9810".$phone;
>> $phone =~ s/^98107/98/;
>> Или на Perl:
>> $phone = '9810'.$phone  unless $phone =~ s/^7/98/;
> Я вот жду, не предложит ли кто-нибудь решение _только единственным_ s/// без
> вставок кода через /e или (?{}). Думаю, что такое решение или

И где здесь /e или (?{}) ?

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Применение условий замены в регулярном выражении"  +/
Сообщение от XAnder (ok) on 11-Авг-13, 22:36 
> И где здесь /e или (?{}) ?

Да я не о том. "/e или (?{})" - это _примеры_ того, как можно вставить код внутрь s///. Разумеется, код можно оставить и снаружи, как у вас. Не в этом дело. Хочется понять, есть ли решение "_только единственным_ s///", 1 шт., без чего-либо другого.

PS. Я не ищу здесь ни практического применения, ни глубинного смысла. Просто интересно.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Применение условий замены в регулярном выражении"  +/
Сообщение от ACCA (ok) on 12-Авг-13, 18:32 
> снаружи, как у вас. Не в этом дело. Хочется понять, есть
> ли решение "_только единственным_ s///", 1 шт., без чего-либо другого.

А, это ты про теорему Гёделя. Нет, не решается. Её же и смотри.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "Применение условий замены в регулярном выражении"  +/
Сообщение от XAnder (ok) on 13-Авг-13, 15:05 
> А, это ты про теорему Гёделя. Нет, не решается. Её же и
> смотри.

Гёделя, говоришь? "Я сам, брат, из этих."

s/^(?=([^7])|7)7?/98$+[1]$-[1]/;

Читерство, конечно, и use warnings ругается, но условия соблюдены :-) "Нация удовлетворена!"

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "Применение условий замены в регулярном выражении"  +/
Сообщение от ACCA (ok) on 13-Авг-13, 17:28 
>> А, это ты про теорему Гёделя. Нет, не решается. Её же и
>> смотри.
> Гёделя, говоришь? "Я сам, брат, из этих."
>
s/^(?=([^7])|7)7?/98$+[1]$-[1]/;

> Читерство, конечно, и use warnings ругается, но условия соблюдены :-) "Нация

Можно вообще подсунуть regex, который переполнит буфер и исполнит произвольный код. Без /e и (?{}). Условия соблюдены.

"Читерство" и есть "выход за рамки системы". Гёдель - он такой, на кривой его не объедешь.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

6. "Применение условий замены в регулярном выражении"  +/
Сообщение от St.Wepricki (ok) on 07-Авг-13, 12:18 
Огромное спасибо всем уделившим внимание и время!
Вариант предложенный XAnder'ом более чем мне помог, ему отдельное огромное человеческое спасибо.
Можно сказать дело закрыто. С Вашей помощью.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру