2009-06-29 12 views
5

ho bisogno di un'espressione regolare per convalidare un timestamp del formato, utilizzando Javascript:espressioni regolari per convalidare un timestamp

AAAA/MM/GG HH: MI: SS

I ho provato a cucinarne alcuni, ma sembra che le mie abilità regex non coprano qualcosa o altro.

Per favore dammi un riferimento o un modo per farlo.

P.S. : Cito regex, solo come suggerimento. Sto usando Javascript e benvenuto a qualsiasi alternativa.

+7

È 2009/14/35 27:63:60 valida? In caso contrario, sarà brutto con espressioni regolari. – balpha

+0

Che lingua stai usando? Se questo è Perl, puoi invocare il codice dalla regex, che è probabilmente l'unico modo per eseguire un controllo di facile lettura. Solo il codice per convalidare se è un anno bisestile per convalidare se il 29 febbraio esista renderebbe la cosa brutta come tutti escono. –

+0

Ho parlato di regex, solo come suggerimento. Sto usando Javascript e benvenuto a qualsiasi alternativa. –

risposta

16

Si consiglia di utilizzare Datejs per questo. L'analisi della data non è necessaria e un Regex non è sufficiente per convalidare un timestamp. Con datejs si potrebbe analizzare la stringa in una data e si otterrà nulla se non valida:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss"); 
+0

Grazie! Fa quello che mi serve. –

0

stile perl: [12] \ d {3}/[01] \ d/[0-3] \ d [0-2] \ d (? :: [0-5] \ d) { 2}

+0

Se non hai bisogno di secondi bisestili. –

5

Se si desidera solo per convalidare la sintassi, qui è l'espressione regolare POSIX:

[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} 

Ma se si desidera controllare la semantica, vorrei elaborare la stringa usando lingua di propria scelta, ci sono troppi casi che non è possibile coprire con espressioni regolari (come anni bisestili/secondi, ora legale, ecc.)

+0

penso che sarebbe meglio come [0-9] {4,4}/[0-9] {2,2}/[0-9] {2,2} [0-9] { 2,2}: [0-9] {2,2}: [0-9] {2,2} –

+1

A seconda delle esigenze, sì. Ma puoi usare {x} invece di {x, x}. – soulmerge

0

Regular-Expressions.info è una buona fonte di in formazione su RegEx, ha anche un buon tutorial.

+1

Un commento perché questo è downvoted sarebbe profondamente apprezzato. Non riesco a capire perché il collegamento a un sito Web di riferimento RegEx debba essere ridimensionato, soprattutto quando si afferma nella domanda "Per favore datemi un riferimento o un modo per farlo". – RuudKok

0

Utilizzando

(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d 

potrebbe convalidare la sintassi, ma come sottolinea balpha, che non lo rende una data valida.

6

Si dovrebbe considerare di non farlo con le espressioni regolari, ma piuttosto basta eseguire la stringa attraverso DateTime con la stringa di formato corretta. In questo modo puoi assicurarti che sia effettivamente un timestamp valido e non solo qualcosa che sembra.

1
function validateTimestamp(timestamp) { 

    if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) { 
     return false; 
    } 

    var split = timestamp.split(/[^\d]+/); 

    var year = parseFloat(split[0]); 
    var month = parseFloat(split[1]); 
    var day = parseFloat(split[2]); 

    var hour = parseFloat(split[3]); 
    var minute = parseFloat(split[4]); 
    var second = parseFloat(split[5]); 

    return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32; 

} 
3

Ecco una regex che ho scritto prima di oggi per la convalida di stringhe in un formato simile a quello che lei ha citato: YYYY-MM-DD hh:mm:ss. Non identifica alcune date scadenti (ad esempio, il 30 febbraio) ma potrebbe essere leggermente migliore rispetto all'utilizzo del semplicistico \d in ciascuna posizione.Cose da notare:

  1. è possibile specificare solo una data, solo un momento, o entrambi la data + tempo
  2. tempo può essere in 12 ore o 24 ore in formato
  3. secondi sono facoltativi
  4. am/pm è facoltativo

    const std::string dateAndTimeRegex = 
        "^\\s*"      // ignore whitespace 
        "("       // start of date 
         "201[0-9]"    // year: 2010, 2011, ..., through 2019 
         "\\W"     // delimiter between year and month; typically will be "-" 
         "([0]?[0-9]|1[012])" // month: 0 through 9, or 00 through 09, or 10 through 12 
         "\\W"     // delimiter between month and day; typically will be "-" 
         "([012]?[0-9]|3[01])" // day: 0 through 9, or 00 through 29, or 30, or 31 
        ")?"      // end of optional date 
        "\\s?"      // optional whitespace 
        "("       // start of time 
         "([01]?[0-9]|2[0-3])" // hour: 0 through 9, or 00 through 19, or 20 through 23 
         "\\W"     // delimiter between hours and minutes; typically will be ":" 
         "([0-5][0-9])"   // minute: 00 through 59 
         "("      // start of seconds (optional) 
          "\\W"    // delimiter between minutes and seconds; typically will be ":" 
          "([0-5][0-9])"  // seconds: 00 through 59 
         ")?"     // end of optional seconds 
         "(\\s*[AaPp][Mm])?"  // optional AM, am, PM, pm 
        ")?"      // end of optional time 
        "\\s*$";     // trailing whitespace 
    
4

ho appena scritto una regex per controllare un datetime MySQL (e penso che non è così diff erent per Oracle o altri server di database).

Questo ReGex è molto sicuro e controlla la validità della data (mesi in 28, 30 & 31 giorni e anche anni con 29/02). Quindi, controlla il tempo. Il formato timestamp è questo:

AAAA-MM-GG HH: MM: SS

Ecco il Regex (piuttosto lungo):

((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([][0-9]):([][0-9])) 

Partite

2013-04-05 17:59:59 | 2013-07-30 01:22:42 | 2099-12-30 23:59:59 | 2016-02-28 00:00:00

non-match

2016-02-29 -01: 01: 02 | 3000-04-24 17:42:21 | 2012-03-03 24:24:02 | 2012-03-03 21:60:45

Non credo di poterne fare uno più sicuro. Molto funzionale e testato. Per favore, se lo si utilizza, non esitate a darmi le risposte;)

FYI: Se si guarda per il controllo della data Regex senza tempo, si prega di andare lì per trovarlo: Regular Expression to match valid dates (controllare il mio post) .

Acclamazioni

1

Per una data valida tra il 1000 e l'anno 2999 l'uso:

String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)"; 

I mesi possono variare tra 01 e 12, i giorni tra 01 e 31 e il tempo tra le 00:00 : 00 e 23:59:59.

0
function isTimestamp($input){ 
      var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/; 
      return $regex.test($input); 
     } 

assegno si prega di