вытаскивая даты из строки - PullRequest
3 голосов
/ 14 августа 2011

Моя проблема заключается в следующем:

У меня есть массив строк, которые содержат даты и другие данные. Моя дата будет иметь один из нескольких форматов:

  1. дд / мм / гггг
  2. дд / мм / гг
  3. мм / гг
  4. д / м / год
  5. гггг
  6. уу

Есть ли способ найти в строке числа, соответствующие этому шаблону в строке?

Кроме того, было бы неплохо, если бы я мог проверить, находится ли дд между 1 и 31 включительно и т. Д., Но было бы не так плохо, если бы мне пришлось делать это потом.

1 Ответ

8 голосов
/ 14 августа 2011

Каждый из них соответствует регулярному выражению.

Вот регулярные выражения для каждого:

  • дд / мм / гггг ==> \b(?:[012][1-9]|3[01])/(?:0[1-9]|1[012])/\d{4}\b
  • дд / мм / гг ==> \b(?:[012][1-9]|3[01])/(?:0[1-9]|1[012])/\d{2}\b
  • мм / гг ==> \b(?:0[1-9]|1[012])/\d\d\b
  • д / м / гг ==> \b[1-9]/[1-9]/\d\d\b
  • гггг ==> \b\d{4}\b
  • гг ==> \b\d\d\b

Конечно, вы можете комбинировать их по-разному. Вы даже можете сделать одно супер регулярное выражение.

Последний довольно интересный, хотя. Я могу представить себе случай, когда в вашем тексте может быть просто старое число, например 42, которое на самом деле может не соответствовать году. Тем не менее, я думаю, вы можете постобработать это.

Счастливое регулярное выражение.

ДОПОЛНЕНИЕ

Чтобы ответить на несколько вопросов в комментариях:

  1. Да, это работает в начале и конце строки, потому что \b - это граница слова , которая включает все переходы от символов слова (букв, цифр и подчеркиваний) к несловесные символы и наоборот, включая начало и конец строки.

  2. Чтобы увидеть тесты, см. Здесь: http://jsfiddle.net/wRufK/. Да, я знаю, что это на JavaScript, а не на C #, но jsfiddle - очень удобный способ показать код в действии. Однако есть различия - в C # мы используем Regex.match, а в регулярном выражении JavaScript есть дополнительные обратные слэши, чтобы избежать внутренних прямых косых черт.

  3. indexOf может быть излишним в зависимости от применения. Если вы хотите найти все совпадения, см. http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx для получения информации о повторном сопоставлении. Вы также можете изменить регулярные выражения для захвата.

  4. Поскольку ваши даты могут быть в любой из вышеперечисленных форм и, возможно, в других, предпочтительным может быть одно регулярное выражение. Здесь очень гибкая система поиска дат: http://www.regular -expressions.info / date.html . Возможно, вы захотите рассмотреть его вместо точного определения набора.

...