2010-01-22 12 views
1

Comment l'expression rationnelle ci-dessous peut-elle être modifiée pour faire correspondre les dates avec les ordinaux de la partie jour? Cette regex correspond "Jan 1er, 2003 | Février 29, 2004 | Novembre 02, 3202" mais j'ai besoin de faire correspondre: "1er janvier 2003 | 29 février 2004 | 02 novembre 3202 | 3 mars 2010"Modifier regex pour faire correspondre les dates avec les ordinaux "st", "nd", "rd", "th"

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2})) 

Merci.

+0

En anglais seulement, je présume? –

+1

Ma (r (ch)? | Y) correspondra à Marie, est-ce le comportement désiré? :) –

+2

Igor, non, ce ne sera pas. Le tuyau est entre l'ensemble de "r (ch)?" Andy". Cela correspondra à "r", "rch" ou "y". –

Répondre

4

Cela dépendra de votre cas d'utilisation, mais dans l'intérêt du pragmatisme, vous feriez bien de faire correspondre tout ce qui correspond:
(1) n'importe quel nom du mois ou une abréviation;
(2) espace blanc;
(3) un ou deux chiffres;
(4) espace blanc;
(5) tout st, nd, rd, th;
(6) espace blanc OU virgule + espace blanc facultatif; 7) quatre chiffres quelconques;

Je ne suis pas sûr de ce que vous correspondant, mais si je devais Jan 35nd,3001, je pense que je préfère capture maintenant et invalident plus tard que de sauter au-dessus à droite au rendez-vous aller.

En outre, en fonction de votre ensemble de données, examiner les questions cas de sensibilité et communs variantes anglais internationaux, comme 1 Jan 2004 ou 1st Jan, 2004 ou January, 2004 etc.

sauts de ligne ajouté

^(?:j(?:an(?:uary)?|un(?:e)?|ul(?:y)?)?|feb(?:ruary)?|ma(?:r(?:ch)?|y) 
|a(?:pr(?:il)?|ug(?:ust)?)|sep(?:t|tember)?|oct(?:ober)?|(?:nov|dec)(?:ember)?) 
\s+\d{1,2}(?:st|nd|rd|th)?(?:\s+|,\s*)\d{4}\b 

Encore plus pragmatique (et lisible), sauf si vous avez un ensemble de données très bizarre, est de permettre quelque chose après les préfixes communs:

(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*?\s+\d{1,2}(?:[a-z]{2})?(?:\s+|,\s*)\d{4}\b 

Est-ce que cela correspond à octagenarianism 99xx, 0000? Oui. Cela risque-t-il d'être un problème? J'en doute.

+0

Je suis d'accord avec vous. Je ne sais rien à propos de regex donc je devais compter sur un échantillon que j'avais trouvé. J'ai testé votre échantillon contre http://regexlib.com/RETester.aspx et il ne pouvait pas correspondre le 20 janvier 2020. – IEnumerator

+0

Désolé, certains métacaractères perl regex se sont faufilés là. Je l'ai édité pour correspondre à la saveur .NET. – Jay

+0

merci. Fonctionne très bien. – IEnumerator

2

Cette regex fait trop de waaaaay. Vous feriez mieux d'utiliser l'équivalent de votre langue: strptime(). Cependant, l'expression rationnelle ci-dessous correspondra ordinaux:

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31(st)?)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))(st|nd|rd|th)?|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(th)?(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))(st|nd|rd|th)?))\,\ ((1[6-9]|[2-9]\d)\d{2})) 

Notez qu'il correspondra aussi des choses comme « 20nd », mais la probabilité de rencontrer que des données réelles est trop faible pour déranger les soins dans la plupart des cas.

+0

Bien que j'aime votre réponse et que cela fonctionne, j'ai choisi l'expression rationnelle de Jay car elle était plus petite. J'aimerais pouvoir choisir les deux comme corrects. – IEnumerator