Технически это ошибка, но я более склонен назвать это дырой в своей логике. Вот как Chronic::Repeater.scan_for_month_names решает, что в месяц: имена
Месяц являются либо три буквы, или полное имя.
Вы можете извлечь этот метод из источника, изменить шаблоны в соответствии с вашими потребностями, а затем перезаписать этот метод вместе с отправкой его в виде патча, чтобы настройка была добавлена к будущим версиям драгоценного камня. Или вы можете изменить входящую строку, выполнив поиск трехбуквенных аббревиатур в начале слова и обрезая посторонние символы.
ОК, вот что-то жевать:
require 'abbrev'
MONTHS = %w[
january
february
march
april
may
june
july
august
september
october
november
december
]
MONTHS_ABBREV = Abbrev.abbrev(MONTHS)
MONTHS_REGEX = /\b(?:j(?:a(?:n(?:u(?:a(?:ry?)?)?)?)?|u(?:ly?|ne?))|s(?:e(?:p(?:t(?:e(?:m(?:b(?:er?)?)?)?)?)?)?)?|a(?:u(?:g(?:u(?:st?)?)?)?|p(?:r(?:il?)?)?)|d(?:e(?:c(?:e(?:m(?:b(?:er?)?)?)?)?)?)?|f(?:e(?:b(?:r(?:u(?:a(?:ry?)?)?)?)?)?)?|n(?:o(?:v(?:e(?:m(?:b(?:er?)?)?)?)?)?)?|o(?:c(?:t(?:o(?:b(?:er?)?)?)?)?)?|ma(?:r(?:ch?)?|y))\b/i
%w[j ja jan janu january f fe feb febr february].each do |m|
puts "#{ m } => #{ MONTHS_ABBREV[m[MONTHS_REGEX]] }"
end
Какие выходы:
j =>
ja => january
jan => january
janu => january
january => january
f => february
fe => february
feb => february
febr => february
february => february
Другими словами, j
не является уникальным, так что это не хит. ja
уникален и связан с january
, как и остальные тесты ja...
. f
уникален, поэтому он попадает, как и все остальные тесты f...
.
Что делает Abbrev.abbrev
? Он разбивает слова, переданные в, на минимальные уникальные строки, используемые для определения всего слова. Вот как это выглядит, если я использую только четыре месяца:
require 'abbrev'
MONTHS = %w[
march
may
june
july
]
MONTHS_ABBREV = Abbrev.abbrev(MONTHS)
pp MONTHS_ABBREV
Результирующее в:
{"marc"=>"march",
"mar"=>"march",
"jun"=>"june",
"jul"=>"july",
"march"=>"march",
"may"=>"may",
"june"=>"june",
"july"=>"july"}
Те делают замечательные стартовые значения для регулярного выражения.
Где я нашел MONTHS_REGEX
? Хе-хе ... это какой-то волшебный код Perl, используя небольшой известный модуль под названием Regexp::Assemble, который я очень скучаю по Ruby. Это скучно ... нет, это ... дьявольски хорошо и тесно связано с тем, как Perl что-то делает, и у меня болит голова, когда я читаю его, иначе я бы портировал его.
Спасибо за редактирование :) –