2010-10-15 17 views
8

Hai bisogno di aiuto per trovare o avere una RegEx corrispondente a un formato MM/AA o MM/AAAA. Il mio RegExFu è debole e non sono nemmeno sicuro da dove iniziare a scrivere questo.RegEx per abbinare il formato M/YYYY, MM/YYYY, M/YY o MM/YY

I mesi devono essere compresi tra 1 e 12 anni, e ben oltre il 2009 dovrebbero essere validi. Ci scusiamo per non aver menzionato più dettagli prima. Questo è usato come data di scadenza.

Aggiungerò una taglia per chi va al di sopra e oltre e convalida il formato MM/AA o MM/AAAA che è> = la data di oggi. Non ha senso lasciare che le cose scadute superassero il primo livello di validazione.


mi sento male da quando ho cambiato le mie esigenze e doveva essere più specifico in quello che mi serviva metà domanda quindi mi doni premio a tutti coloro che hanno risposto una volta che il no-taglie scade finestra.

+0

Ti piacerebbe http://www.regular-expressions.info/ per un tutorial e http://weitz.de/regex-coach/ per provarli. (\ d \ d)/(\ d \ d) è un inizio per mm/aa. Sry, al momento sono troppo pigro per il resto. – gimpf

+0

Se si prevede di consentire agli utenti di immettere "anni a due cifre", non è consigliabile. Preferisci "4 cifre" (cifre complete) sempre. – BrunoLM

+0

@BrunoLM, beh, l'API con cui sto lavorando accetta il formato MM/YY, quindi ogni piccolo vantaggio che posso dare ai miei utenti che prenderò. – jfar

risposta

11

Che dire

^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 

Partite mesi

// 10 to 12 | 01 to 09 | 1 to 9 
(1[0-2]|0[1-9]|\d) 

E anni

// 2000 to 2099 | 1900 to 1999 
// 01 to 09 | 10 to 99 
(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d) 

per adattarsi qualsiasi cosa >= 2010

/^(1[0-2]|0[1-9]|\d)\/([2-9]\d[1-9]\d|[1-9]\d)$/; 

Risultato:

12/2009 : false 
1/2010 : true 
12/2011 : true 
12/9011 : true 
12/07 : false 
12/17 : true 
+0

@Bruno, questa è fondamentalmente la mia risposta. – Brad

+1

C'è un motivo per cui stai escludendo l'anno "00"? Probabilmente non è una buona pratica da usare poiché è un po 'confusa, ma sembra che sia ancora perfettamente valida. O C# non lo consente per i formati di data? – eldarerathis

+0

@eldarerathis: l'OP non ha detto quale intervallo si aspetta. Ho deciso di escludere "00" perché mi sembra ambiguo. '00' è' 1900' o '2000'? Ad ogni modo, questo è solo un esempio. Quello che consiglio è di usare sempre "4 cifre". – BrunoLM

4

Prova questo:

^(0[1-9]|1[0-2])/(19|2[0-1])\d{2}$ 

costringe a mesi effettivi (1-12) e gli anni 1900-2199.

+0

HHD e circa 10/100: /? –

+0

corrisponde anche a "MM/AAA". –

+0

@klausbyskov, l'ho aggiornato per essere più preciso. – Brad

5

Prova:

var re = new Regex(@"(?<month>\d{2})/(?<year>\d{2}|\d{4})"); 
var month = re.Match(yourString).Groups["month"]; 
... 

Un'alternativa è:

if(dateStr.Length == 5) 
    myDateTime = DateTime.ParseExact("MM/YY", dateStr); 
else 
    myDateTime = DateTime.ParseExact("MM/YYYY", dateStr); 
+0

questo consente al mese di essere 54. – Brad

+0

Grazie per aver segnalato ParseExact. Ciò rende la mia convalida ancora migliore. – jfar

+0

[ParseExact] (http://msdn.microsoft.com/en-us/library/332de853.aspx) può prendere una serie di formati, che è decisamente migliore di una regex. – Kobi

0

@BrunoLM,

^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 

corrisponde a "0/2009". Posso suggerire un piccolo miglioramento:

^(1[0-2]|0[1-9]|[1-9])\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$ 
Problemi correlati