2015-12-21 7 views
8

Quindi sono estremamente nuovo al mondo Javascript. Mi stavo esercitando su codewars che dovevano analizzare un pin per essere sicuro che contenesse solo numeri e fosse di 4 o 6 caratteri. Ho guardato il codice più intelligente e la risposta è stata:

function validatePIN(pin) { 
    return /^(\d{4}|\d{6})$/.test(pin) 
} 

Non ho mai visto il "/^(\ d {4} | \ d {6}) $ /" po 'prima. Qualcuno potrebbe dirmi come si chiama così posso cercarlo da solo o darmi una descrizione di come funziona?

+2

espressioni regolari (regex) validazione in JavaScript ... –

+2

[MDN: 'RegExp.p rototype.test'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) – Bergi

+0

@sysk L'intento dell'originale è più chiaro (anche se effettivamente equivalente). E "l'efficienza" in questo contesto è sciocca ... anche se i paren hanno fatto la differenza, non stai corrispondendo a gigabyte di PIN. – alexis

risposta

17

E 'un regular expression literal, simile ad usare return new RegExp('^(\\d{4}|\\d{6})$').test(pin) La parte "letterale" implica che è un modo per rappresentare un tipo di dati specifico come una stringa nel codice — come true e 'true' sono diversi, in quanto uno è un valore letterale booleano e l'altro è un valore letterale stringa.

In particolare, l'espressione regolare ^(\d{4}|\d{6})$ rompe a:

^  a string that starts with... 
(  either 
    \d a digit (0-9)... 
    {4} that repeats four times... 
|  or 
    \d a digit (0-9)... 
    {6} that repeats six times... 
) 
$  and then ends 

Quindi: '1234', '123456', ecc sarebbe partita. '123.00', '12345', 'abc123', ' 1234', ' 1234 ' non corrispondono.

Come notato da molti altri nei commenti sul Draco18s' answer ci sono diverse sfumature di essere a conoscenza di con l'utilizzo di letterali regex in JS:

  • La sintassi letterale non richiede di sfuggire caratteri speciali all'interno del modello regex. L'utilizzo del costruttore RegExp richiede che tu rappresenti il ​​modello come una stringa, che a sua volta richiede l'escaping. Notare le differenze tra \ tra le due sintassi.

  • L'utilizzo di una regex letterale considera la regex come una costante, mentre l'utilizzo di new RegExp() lascia a voi la gestione del ciclo di vita dell'istanza di espressioni regolari.

    La notazione letterale è compilata e implica una regex costante, mentre la versione del costruttore viene riprodotta dalla stringa, quindi il letterale è ottimizzato/memorizzato nella cache.jsperf.com/regexp-literal-vs-constructor/4 Nota: è possibile ottenere praticamente lo stesso effetto mettendo in cache la nuova Regex in una variabile, ma quello letterale viene memorizzato nella cache al passo JIT - user120242

    In altre parole, usando un letterale regex può evitare potenziali insidie ​​di performance :

    Esempio:

    for (var i = 0; i < 1000; i++) { 
        // Instantiates 1x Regex per iteration 
        var constructed = new RegExp('^(\\d{4}|\\d{6})$') 
    
        // Instantiates 1 Regex 
        var literal = /^(\d{4}|\d{6})$/ 
    } 
    
+3

Vunderbar. Penso che questa risposta in realtà copra * tutto * sollevato su questa domanda e in modo più dettagliato. – Draco18s

27

È un'espressione regolare.

Io tendo ad usare http://www.regexpal.com/ quando voglio provare e trovare l'espressione che mi serve, c'è anche http://regexr.com/ per apprendere su di loro (tra le altre risorse).

+13

è un'espressione regolare * letterale *; più specificamente. I '/' 'iniziali e finali non fanno parte della regex, ma dicono a Javascript di trattare tutto ciò che esiste tra loro. È una scorciatoia per 'new Regex ('^ (\ d {4} | \ d {6}) $')' – STW

+4

@STW: La stenografia non funziona a causa della mancanza di escape. È necessario '\\ d {4}', dal momento che '' \ '' ha bisogno di essere sfuggito nel letterale stringa. – nhahtdh

+3

@STW ... ed è per questo che dovresti preferire la sintassi breve se puoi usarla. È il modo giusto, non una stenografia. – edc65