URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9714
[ Назад ]

Исходное сообщение
"Применение условий замены в регулярном выражении"

Отправлено St.Wepricki , 06-Авг-13 15:39 
Добрый день!

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

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

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

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

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

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

Спасибо.


Содержание

Сообщения в этом обсуждении
"Применение условий замены в регулярном выражении"
Отправлено Аноним , 06-Авг-13 18:13 
Откройте для себя встроенную переменную "$_"

"Применение условий замены в регулярном выражении"
Отправлено XAnder , 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/;

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


"Применение условий замены в регулярном выражении"
Отправлено михалыч , 07-Авг-13 05:06 
#!/usr/bin/perl

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

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


"Применение условий замены в регулярном выражении"
Отправлено Andrey Mitrofanov , 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" ?


"Применение условий замены в регулярном выражении"
Отправлено михалыч , 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 с тернарным условным оператором уже всё сказал.
И другие его примеры не хуже.


"Применение условий замены в регулярном выражении"
Отправлено ACCA , 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/;


"Применение условий замены в регулярном выражении"
Отправлено михалыч , 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/;

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


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

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

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


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

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


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

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

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


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

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


"Применение условий замены в регулярном выражении"
Отправлено XAnder , 13-Авг-13 15:05 
> А, это ты про теорему Гёделя. Нет, не решается. Её же и
> смотри.

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

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

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


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

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

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

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


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