Os literais de expressão regular podem ser usados para validar as strings fornecidas pelo cliente. Use string.matches(/pattern/)
para testar se uma string segue um padrão de expressão regular. A sintaxe de expressões regulares não é idêntica à sintaxe de expressões regulares comuns, em particular:
*
+
.
(
)
[
]
{
}
\
funcionam normalmente.- As âncoras
^
e$
só funcionam quando são usadas para corresponder ao primeiro ou ao último caractere no padrão. - apenas a sinalização do modificador
i
(ignorar maiúsculas e minúsculas) tem suporte
Literais
Um literal de expressão regular é introduzido em uma expressão de segurança usando a notação /pattern/
. Para testar se uma string adere a um padrão de expressão regular, use a função membro de correspondências da string. A seguinte regra de correspondência verifica se os novos dados começam com a string foo.
".validate": "newData.val().matches(/^foo/)"
Recursos compatíveis
O Firebase é compatível apenas com um subconjunto de recursos típicos de expressões regulares. No entanto, a sintaxe da expressão regular deve parecer familiar.
Estes são os símbolos aceitos:
Personagem | Significado |
---|---|
\s \w \d \S \W \D |
conjuntos de caracteres predefinidos para correspondência de espaço em branco, um caractere de palavra ou um dígito e as negações (respectivamente) |
\ |
escape, o caractere seguinte será interpretado literalmente. Se você quiser fazer a correspondência com "" em si, escapar também /\/
|
^ |
ao início da string. Só pode ser usado como a primeira letra do padrão.
/a/ corresponde a "ba", e /^a/ não.
|
$ |
ao final da string. Só pode ser usado como a última letra do padrão. e /a/
corresponde a "ab", enquanto /a$/ não.
|
* |
corresponde a zero ou vários do padrão anterior. /^a*$/ corresponde a "" e "aaa", mas não "b"
|
+ |
corresponde a um ou mais do padrão anterior. /^a+$/ corresponde a "a" e "aaa", mas não ""
|
? |
corresponde a zero ou a um do padrão anterior. /^a?$/ corresponde a "" e "a", mas não "aa"
|
. |
corresponde a qualquer caractere /......../ corresponde a "Firebase"
|
(pattern) |
parênteses agrupam um padrão em uma única unidade /(ab)*/ corresponde a "abab"
|
a|b |
corresponde a a ou b /a|bc/ corresponde a "ac" ou "bc"
|
[akz] |
um conjunto de caracteres, corresponde a qualquer um dos caracteres incluídos. /[ABCDEF]/ correspondência somente em letras maiúsculas
letras de A a F.
|
[a-z] |
um intervalo de caracteres, corresponde a todos os caracteres inclusivamente no intervalo especificado. e /[0-9A-F]+/
corresponde a strings hexadecimais
|
[^0-9] |
Um ^ inicial nega o conjunto de caracteres, correspondendo a qualquer coisa que não seja o conjunto especificado.
|
Um i
depois da construção do literal de expressão regular (por exemplo, /yes/i
) indica que a correspondência não diferencia maiúsculas de minúsculas. No momento, outros modificadores de expressão regular não são compatíveis.
A correspondência de expressão regular no Firebase Realtime Database Security Rules não é gananciosa nem não gananciosa, já que ela só permite detectar uma correspondência e não capturar partes da string.
Uso
Exigir que uma string seja uma data no formato AAAA-MM-DD entre 1900 e 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])$/)"
A string precisa ser um endereço de e-mail:
".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"
A string precisa ser um URL básico:
".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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"