2015-03-27 16 views
6

L'espressione regolare deve corrispondere a date valide in una stringa nel formato YYYYMMDD. Ad esempio, aaa_20150327_bbb deve corrispondere ma aaa_20150229_bbb non perché il 2015 non è un anno bisestile.Utilizzo di espressioni regolari per abbinare il formato data in aaaammdm

solo anno dalla - bisogno di essere presa in considerazione.

+3

Non ha intenzione di essere possibile escludere '2/29' se non si tratta di un anno bisestile con espressioni regolari. Almeno non in modo sano. Dovrai analizzarlo dopo il fatto. C'è un problema con '\ d {8}'? O almeno '20 \ d {2} [01] \ d [0123] \ d'? –

+0

@JoeWang Che lingua stai usando? C++ ha la funzionalità per fare questo built-in, senza l'uso di un regex –

+0

ahh ... come si può ottenere questo ... basta fare una ricerca di 5 minuti su ciò che è ti permetterà di essere in grado di escludere questa possibilità. – HuStmpHrrr

risposta

9

Madness totali (anni 0-9999)

il successivo (in base a this risposta) lavora da anni tra 0 e 9999.

(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))0229)|(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d) 

(controllare la demo)


Totale follia semplificato (anni 2000-2099)

Se si vuole si può semplificare di lavorare solo per anni tra il 2000 e il 2099.

(?<!\d)(?:(?:20\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d) 

Ma come si può vedere che non è davvero più semplice.

(controllare il demo)


Il modo sano (anni *)

Per mantenere la vostra sanità mentale si dovrebbe attenersi a una semplice espressione regolare e quindi convalidare utilizzando il codice.

(20\d{2})(\d{2})(\d{2}) 

(controllare il demo)

0

My way (non il modo sano di mente)

(((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))|((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))|((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))|([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)) 

Con vb.net (più facile da capire, penso di sì)

Dim meses31 As String = "((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))" 
    Dim meses30 As String = "((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))" 
    Dim febrero28 As String = "((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))" 
    Dim febrero29 As String = "([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)" 

    Dim patternFecha As String = String.Concat("(", meses31, "|", meses30, "|", febrero28, "|", febrero29, ")")