I valori letterali delle espressioni regolari possono essere utilizzati per convalidare le stringhe fornite dal client. Utilizza string.matches(/pattern/) per verificare se una stringa rispetta un pattern di espressione regolare. La sintassi delle espressioni regolari non è identica alla sintassi delle espressioni regolari comuni, in particolare:
*+.()[]{}\funzionano normalmente.- Gli ancoraggi
^e$funzionano solo se li utilizziamo per trovare una corrispondenza con il primo o l'ultimo carattere del pattern. - È supportato solo il flag modificatore
i(ignora maiuscole e minuscole)
Valori letterali
Un valore letterale di espressione regolare viene introdotto in un'espressione di sicurezza utilizzando la notazione /pattern/. Per verificare se una stringa rispetta un pattern di espressione regolare, utilizza la funzione membro matches della stringa. La seguente regola di corrispondenza verifica se i nuovi dati iniziano con la stringa foo.
".validate": "newData.val().matches(/^foo/)"
Funzionalità supportate
Firebase supporta solo un sottoinsieme delle funzionalità tipiche delle espressioni regolari. Tuttavia, la sintassi delle espressioni regolari dovrebbe risultare familiare.
Questi sono i simboli supportati:
| Carattere | Significato |
|---|---|
\s \w \d \S \W \D |
Set di caratteri predefiniti per trovare una corrispondenza con uno spazio vuoto, un carattere di parola o una cifra e le relative negazioni (rispettivamente) |
\ |
Escape, il carattere seguente viene interpretato letteralmente. Se vuoi trovare una corrispondenza con "" stesso, devi anche utilizzare l'escape /\/
|
^ |
Ancoraggio all'inizio della stringa. Può essere utilizzato solo come prima lettera del pattern.
/a/ trova una corrispondenza con "ba", mentre /^a/ no.
|
$ |
Ancoraggio alla fine della stringa. Può essere utilizzato solo come ultima lettera del pattern. /a/
trova una corrispondenza con "ab", mentre /a$/ no.
|
* |
Trova una corrispondenza con zero o più occorrenze del pattern precedente. /^a*$/ trova una corrispondenza con "" e "aaa", ma non con "b"
|
+ |
Trova una corrispondenza con una o più occorrenze del pattern precedente. /^a+$/ trova una corrispondenza con "a" e "aaa", ma non con ""
|
? |
Trova una corrispondenza con zero o una occorrenza del pattern precedente. /^a?$/ trova una corrispondenza con "" e "a", ma non con "aa"
|
. |
Trova una corrispondenza con qualsiasi carattere /......../ trova una corrispondenza con "Firebase"
|
(pattern) |
Le parentesi raggruppano un pattern in una singola unità /(ab)*/ trova una corrispondenza con "abab"
|
a|b |
Trova una corrispondenza con a o b /a|bc/ trova una corrispondenza con "ac" or "bc"
|
[akz] |
Un set di caratteri, trova una corrispondenza con uno qualsiasi dei caratteri inclusi. /[ABCDEF]/ trova una corrispondenza solo con le lettere maiuscole
da A a F.
|
[a-z] |
Un intervallo di caratteri, trova una corrispondenza con tutti i caratteri inclusi nell'intervallo specificato. /[0-9A-F]+/
trova una corrispondenza con le stringhe esadecimali
|
[^0-9] |
Un ^ iniziale nega il set di caratteri, trovando una corrispondenza con qualsiasi elemento diverso dal set di caratteri specificato.
|
Un i che segue la costruzione del valore letterale dell'espressione regolare (ad es. /yes/i) indica che la corrispondenza non farà distinzione tra maiuscole e minuscole. Al momento non sono supportati altri modificatori di espressioni regolari.
La corrispondenza delle espressioni regolari nelle regole di sicurezza di Firebase Realtime Database non è né greedy né non greedy, poiché consente solo di rilevare una corrispondenza e non di acquisire porzioni della stringa.
Utilizzo
Richiedi che una stringa sia una data nel formato AAAA-MM-GG compresa tra il 1900 e il 2099:
".validate": "newData.isString() && newData.val().matches(/^(19|20)[0-9][0-9][-\\/. ](0[1-9]|1[012])[-\\/. ](0[1-9]|[12][0-9]|3[01])$/)"
Richiedi che la stringa sia un indirizzo email:
".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"
Richiedi che la stringa sia un URL di base:
".validate": "newData.isString() && newData.val().matches(/^(ht|f)tp(s?):\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*((0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"