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

Maxim Vuets maxim.vuets на gmail.com
Вс Окт 19 10:08:53 PDT 2008


Приятель попросил помочь с регулярным выражением (РВ).
Есть строка из произвольного количества чисел, которые
разделенны знаком "плюс". Например:
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.
Если я где-то ошибся в рассуждениях или "чувак, все делается
гораздо проще" -- пожалуйста, говорите (;

-- 
 .  Hoc est simplicissimum!
..: maxim.vuets.name


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