Ruby/Практикум/Правила: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 9:
 
'''Замечания по решению:'''
1) Не распознаёт даты вида "29 июня 987 года город Коимбра взята войсками аль-Мансура"
 
Исправляем:
<source lang=ruby>str = "Сегодня 3 декабря 2007... или 29 июня 987 года... хз, короче"
p str.scan(/([1-9]|[12][\d]|[3][01]) (декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября) ([1-9]{1}\d*)/)</source>
 
2) Возвращаем массив массивов строк, а не просто массив строк (это может даже хорошо, так проще будет обрабатывать число/месяц/год)
 
Есть 2 варианта исправления: либо для всех подмассивов сделать .join(" "), либо указать во всех группировках (?:...) - группировка без сохранения результата:
 
<source lang=ruby>str = "Сегодня 3 декабря 2007... или 29 июня 987 года... хз, короче"
p str.scan(/(?:[1-9]|[12][\d]|[3][01]) (?:декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября) (?:[1-9]{1}\d*)/)</source>
 
3) Лишний пробел между частями даты - и всё ломается. Решение: вместо " " писать \s+:
 
<source lang=ruby>str = "Сегодня 3 декабря 2007... или 29 июня 987 года... хз, короче"
p str.scan(/(?:[1-9]|[12][\d]|[3][01])\s+(?:декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября)\s+(?:[1-9]{1}\d*)/)</source>
 
=== Дана строка. Необходимо найти максимальное из имеющихся в ней вещественных чисел. ===