Expresiones regulares de las reglas de seguridad de Firebase

Los literales de expresión regular se pueden usar para validar las strings que proporciona el cliente. Usa 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:

  • * + . ( ) [ ] { } \ funcionan con normalidad.
  • Las anclas ^ y $ solo funcionan si las usamos para hacer coincidir el primer o el último carácter del patrón.
  • solo se admite la marca modificadora i (ignorar mayúsculas y minúsculas)

Literales

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

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

Funciones compatibles

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

Estos son los símbolos admitidos:

Personaje Significado
\s \w \d \S \W \D grupos de caracteres predefinidos para la coincidencia de espacios en blanco, un carácter de palabra o un dígito, y sus negaciones (respectivamente)
\ escape, el carácter que sigue se interpreta literalmente.
Si quieres que coincida con "" y escapar de ella /\/
^ ancla al principio de la cadena. Solo se puede usar como la primera letra del patrón.
/a/ coincide con "ba", mientras que /^a/ no.
$ ancla al final de la cadena. Solo se puede usar como la última letra del patrón.
de /a/ coincide con "ab", mientras que /a$/ no.
* coincide con muchos del patrón anterior o con ninguno.
/^a*$/ coincide con "" y "aaa", pero no "b"
+ coincide con uno o más de los patrones anteriores.
/^a+$/ coincide con "a" y "aaa", pero no ""
? coincide con cero o uno de los patrones anteriores.
/^a?$/ coincide con "" y "a", pero no "aa"
. coincide con cualquier carácter
/......../ coincide con "Firebase"
(pattern) 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 grupo de caracteres, coincide con cualquiera de los caracteres incluidos.
/[ABCDEF]/ coincidencias solo en mayúsculas letras de la A a la F.
[a-z] un intervalo de caracteres, coincide con todos los caracteres inclusive en el rango especificado.
de /[0-9A-F]+/ coincide con cadenas hexadecimales
[^0-9] Un ^ inicial niega el grupo de caracteres, por lo que coincide con cualquier otro elemento que no sea el grupo de caracteres especificado.

Una i al final de la construcción literal de la expresión regular (p.ej., /yes/i) indica que la coincidencia no distingue mayúsculas de minúsculas. En este momento, no se admiten otros modificadores de expresiones regulares.

La coincidencia de expresiones regulares en Firebase Realtime Database Security Rules no es voraz ni codiciosa, ya que solo te permite detectar una coincidencia y no capturar partes de la cadena.

Uso

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

Exigir 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)"

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