2016-11-26 4 views
0

Я пытаюсь разобрать некоторые даты в текстовом поле, которое может быть в следующих форматах (обратите внимание, что в текстовом поле есть куча других нежелательных эффектов, связанных с датами):Шаблон регулярного выражения для дат с разными символами и форматами с переменными цифрами

//with dashes 
10-10-16 
1-5-16 
10-1-16 
1-10-16 

//with periods 
10.10.16 
1.5.16 
10.1.16 
1.10.16 

//with forward slashes 
10/10/16 
1/5/16 
10/1/16 
1/10/16 

Что мне нужно, это один шаблон для всех сценариев с цифровым форматированием. Вот то, что я пробовал:.

//x.xx.xx 
Regex reg1 = new Regex (@"\(?\d{1}\)?[-/.]? *\d{2}[-/.]? *[-/.]?\d{2}") 

//xx.xx.xx 
Regex reg2 = new Regex (@"\(?\d{2}\)?[-/.]? *\d{2}[-/.]? *[-/.]?\d{2}") 

//x.x.xx 
Regex reg3 = new Regex (@"\(?\d{1}\)?[-/.]? *\d{1}[-/.]? *[-/.]?\d{2}") 

//xx.x.xx 
Regex reg4 = new Regex (@"\(?\d{2}\)?[-/.]? *\d{1}[-/.]? *[-/.]?\d{2}") 

Я новичок в регулярных выражений, так что я ищу одного выражения, который будет обрабатывать все эти сценарии (т.е. цифры форматов с одним номером и цифр двухзначного для - /. между).

Есть ли выражение, которое могло бы справиться с этим?

Спасибо,

ответ

2

Я могу предложить

Regex rx = new Regex(@"\(?(?<!\d)\d{1,2}\)?[-/.]?\d{1,2}[-/.]?\d{2}(?!\d)"); 

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

Regex rx = new Regex(@"\(?(?<!\d)\d{1,2}\)?([-/.])\d{1,2}\1\d{2}(?!\d)"); 

ВИДЕТЬ regex demo 1 и demo 2.

Детали:

  • \(? - необязательный (
  • (?<!\d) - не должно быть никаких цифр перед текущим местоположением
  • \d{1,2} - 1 или 2 цифры
  • \)? - необязательный )
  • [-/.]? - опционально -, /, или .
  • \d{1,2}[-/.]? - ibid.
  • \d{2} - 2 цифры
  • (?!\d) - после текущего местоположения не должно быть цифр.

версия с захватом группой/обратная ссылка содержит ([-/.]) - это группа записи с ID = 1, что соответствует первому сепаратору, и \1 является обратной ссылкой, которая соответствует один и тому же тексту захваченного в группе 1 (изготовление второго сепаратора для быть идентичным первому).

+0

Если дата сепараторы используются последовательно, используйте обратную ссылку с захватом группы - 'Regex ой = новый Regex (@" \ ((?

0

Вы также можете попробовать это: \d{1,2}([-./])\d{1,2}\1\d{2}

Regex regex = new Regex(@"\d{1,2}([-./])\d{1,2}\1\d{2}");

  • \d{1,2} между одним и двумя цифрами
  • ([-./]) любой из ., - и /
  • \1 повторить этот характер в другой раз (предотвратить совпадение 1.1/01 или 1-1.01)
  • \d{2} соответствует две цифре
+0

Я также подумал о публикации этого шаблона в качестве альтернативы, но обратные ссылки более ограничительны, в то время как повторение символьного класса '[. /]' Найдет совпадения в более слабых контекстах. –

0

попробовать этот

\d{1,2}(-|\.|\/)\d{1,2}(-|\.|\/)\d{1,2} 
Смежные вопросы