Как разобрать строку, чтобы извлечь значения диапазона года? - PullRequest
0 голосов
/ 04 ноября 2010

Я получил запрос на изменение, и я не уверен, как лучше к нему подойти.Если клиент ищет что-то, и он указывает диапазон года или года, который больше, чем у нас в нашей базе данных, я должен вернуть результат, который соответствует последнему диапазону года, который у нас есть.

В настоящее время результаты мыв базе данных все следуют одному из следующих шаблонов:

Thing1 Thing2 S1 // There's some results with no year
Thing1 Thing2 2006-07 Series 6 // there's some results with 'Series X'
Thing1 Thing2 2006-2007 S12 RP // some resuls have SN or SN YZ
Thing1 Thing2 2020-21 S6 // some results don't have a full second year
Thing1 Thing2 2022-2024 S12
Thing1 Thing2 2024 Onwards // the result that matches the final year just has the year & 'Onwards'

В мире доступно больше результатов для Thing1 Thing2, вплоть до 2060 года, но мы сохраняем данные только на +14 лет, потому чточерез 14 лет (скажем, 2026 или 2028) данные точно такие же, как и в предыдущие годы.

Максимальный год, который мы имеем, и максимальный год существования увеличивается на 2 года каждые 2 года.Таким образом, в 2012 году у нас будет Thing1 Thing2 до 2026 года, и максимум в существовании будет 2062.

Итак, в основном мне нужно определить, когда клиент ищет [Thing1 (или) Thing2 с диапазоном года], и если значение первого года больше, чем [в этом году + 14], я должен вернуть [в этом году + 14], но только если текущий год является четным, в противном случае я должен вернуться [в этом году + 13].

Проблема, с которой я столкнулся, заключается в том, как определить год в середине строки, которая не следует четко определенной схеме, за исключением того, что первая часть диапазона года начинается с четырехзначного года..

Какой лучший способ для меня это сделать?Может ли кто-нибудь подсказать, как я мог бы подойти к решению этой проблемы?Спасибо.

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Этот шаблон регулярного выражения будет хорошо работать: \b(?<Year1>\d{4})(?:-(?<Year2>\d{2,4}))?\b

Объяснение:

  • \b: это словосочетание, которое гарантирует, что мы собираем годы полностью на ихсобственный, а не как часть другого слова (т.е. без частичного совпадения) - это используется для привязки обоих концов шаблона
  • (?<Year1>\d{4}): именованная группа захвата соответствует 4 цифрам
  • (-(?<Year2>\d{2,4}))?: это соответствует тире - и затем использует именованную группу захвата для 2-го года, которая соответствует 2-4 повторяющимся цифрам, поскольку эти годы различаются по длине.Открывающая и закрывающая скобки группируют этот шаблон вместе, и, наконец, завершающий ? делает всю группу необязательной для случаев, когда второй год не существует.

Технически, часть \d{2,4} принимает 07, 107 , 2007. Очевидно, что трехзначный год неверен.Я предлагаю вам выполнить дополнительную проверку ошибок, чтобы зафиксировать такие сценарии.Вы могли бы предотвратить это, изменив значение на \d{2}|\d{4}, но тогда вы бы выбрали год1, а не год2 и потеряли бы пользовательский ввод.

Вот код:

string[] inputs = { "Thing1 Thing2 S1", "Thing1 Thing2 2006-07 Series 6", "Thing1 Thing2 2006-2007 S12 RP", "Thing1 Thing2 2020-21 S6", "Thing1 Thing2 2022-2024 S12", "Thing1 Thing2 2024 Onwards" };
string pattern = @"\b(?<Year1>\d{4})(-(?<Year2>\d{2,4}))?\b";
Regex rx = new Regex(pattern);

foreach (var input in inputs)
{
    Match m = rx.Match(input);
    Console.WriteLine("{0}: {1}", m.Success, input);
    if (m.Success)
    {
        string year1 = m.Groups["Year1"].Value;
        string year2 = m.Groups["Year2"].Value;
        Console.WriteLine("Year1: {0}, Year2: {1}", year1, year2 == "" ? "N/A" : year2);
    }
    Console.WriteLine();
}
0 голосов
/ 04 ноября 2010

или регулярное выражение типа

perl -ne '/(\d\d\d\d)-(\d\d(\d\d)?)/; print "$1:$2:$3"'
0 голосов
/ 04 ноября 2010

Может быть, просто поиск первых 4 числовых символов (если таковые имеются) в строке и обработка их как год будет работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...