Reglas de seguridad de Firebase Expresiones regulares

Se pueden utilizar literales de expresiones regulares para validar cadenas proporcionadas por el cliente. Utilice string.matches(/pattern/) para probar si una cadena se adhiere a un patrón de expresión regular. La sintaxis de las expresiones regulares no es idéntica a la sintaxis de las expresiones regulares comunes, en particular:

  • * + . ( ) [ ] { } \ funciona normalmente.
  • Los anclajes ^ y $ solo funcionan si los usamos para hacer coincidir el primer o el último carácter del patrón.
  • sólo se admite el indicador modificador i (ignorar mayúsculas y minúsculas)

Literales

Un literal de expresión regular se introduce en una expresión de seguridad utilizando la notación /pattern/ . Para probar si una cadena se adhiere a un patrón de expresión regular, use la función miembro de coincidencias de la cadena. La siguiente regla de coincidencias verifica si los nuevos datos comienzan con la cadena foo.

".validate": "newData.val().matches(/^foo/)"

Funciones admitidas

Firebase solo admite un subconjunto de funciones típicas de expresiones regulares. Sin embargo, la sintaxis de la expresión regular debería resultarle familiar.

Estos son los símbolos admitidos:

Personaje Significado
\s \w \d \S \W \D conjuntos de caracteres predefinidos para hacer coincidir espacios en blanco, un carácter de palabra o un dígito y sus negaciones (respectivamente)
\ escape, el siguiente personaje se interpreta literalmente.
Si desea hacer coincidir "", escápelo también /\/
^ anclar al comienzo de la cuerda. Esto sólo se puede utilizar como la primera letra del patrón.
/a/ coincide con "ba", mientras que /^a/ no.
$ ancla al final de la cuerda. Esto sólo se puede utilizar como la última letra del patrón.
/a/ coincide con "ab", mientras que /a$/ no.
* coincide con cero o muchos del patrón anterior.
/^a*$/ coincide con "" y "aaa", pero no con "b"
+ coincide con uno o más de los patrones anteriores.
/^a+$/ coincide con "a" y "aaa", pero no con ""
? coincide con cero o uno del patrón anterior.
/^a?$/ coincide con "" y "a", pero no con "aa"
. coincide con cualquier personaje
/......../ coincide con "Firebase"
(pattern) El paréntesis agrupa un patrón en una sola unidad.
/(ab)*/ coincide con "abab"
a|b coincide con a o b
/a|bc/ coincide con "ac" o "bc"
[akz] un conjunto de caracteres, coincide con cualquiera de los caracteres incluidos.
/[ABCDEF]/ coincide solo con letras en mayúscula de la A a la F.
[az] un intervalo de caracteres, coincide con todos los caracteres inclusive en el rango especificado.
/[0-9A-F]+/ coincide con cadenas hexadecimales
[^0-9] Un ^ inicial niega el juego de caracteres y coincide con cualquier cosa que no sea el juego de caracteres especificado.

Una i detrás de la construcción literal de la expresión regular (por ejemplo /yes/i ) indica que la coincidencia no distinguirá entre mayúsculas y minúsculas. Otros modificadores de expresiones regulares no son compatibles en este momento.

La coincidencia de expresiones regulares en las reglas de seguridad de la base de datos en tiempo real de Firebase no es ni codiciosa ni no codiciosa, ya que solo le permite detectar una coincidencia y no capturar partes de la cadena.

Uso

Requerir que una cadena sea una fecha con formato AAAA-MM-DD entre 1900-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])$/)"

Requerir que la cadena sea una dirección de correo electrónico:

".validate": "newData.isString() && newData.val().matches(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i)"

Requerir que la cadena sea una URL básica:

".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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"