[Moscow.pm] regexp для "72+83+94+05..."

Ivan B. Serezhkin ivan на serezhkin.com
Пн Окт 20 05:49:48 PDT 2008


Хелло !

^(\d+\+)*(\d+)$

Maxim Vuets wrote:
> Приятель попросил помочь с регулярным выражением (РВ).
> Есть строка из произвольного количества чисел, которые
> разделенны знаком "плюс". Например:
> 42
> 33+55
> 72+83+94+05
> Необходимо выдрать все числа с одновременной валидацией.
> То есть, быть уверенным, что строка была правильного формата
> (потому /\d+/g не катит).
>
> Ему хотелось чего-то типа, как он сказал, ^(\d+)(?:\+(\d+))*$.
> Но это работает иначе (:
>
> Такой вариант ему тоже не подешел:
> $ echo -n 71+82+93+04 | perl -ne 'print join ", ", /\d+/g if
> /^\d+(?:\+\d+)*$/; print "\n"'
> Сказал, что нужен один-единственный regexp, так как он
> его вставлял в Catalyst для сопоставления с URL-ами.
>
> В конце-концов, освежив память perlre-ом, я выдал это:
> $ echo -n 72+83+94+05 | perl -ne 'print join ", ",
> /\G(\d+)(?:\+(?=\d+(?:\+\d+)*\Z)|\Z)/g; print "\n"'
> Работает точно как требуется, но тоже не подошло (%
> Потому что завязанно на ключе g. (А Catalyst-у передается
> "серцевина" РВ; и ключ g нельзя поставить через (?:),
> так как он задает поведение оператора m//.)
>
> Короче, сделал он по KISS-у:
> return $c->detach( '/default' ) unless $ids =~ m/^\d+(?:\+\d+)*$/;
> my @ids = split('\+', $ids);
> А я получил реальную практику использования расширенных РВ.
>
> Такой вот just for fun.
> Если я где-то ошибся в рассуждениях или "чувак, все делается
> гораздо проще" -- пожалуйста, говорите (;
>
>   


-- 
Ivan B. Serezhkin



Подробная информация о списке рассылки Moscow-pm