Firebase 安全规则正则表达式

正则表达式文字可用于验证客户端提供的字符串。使用string.matches(/pattern/)测试字符串是否符合正则表达式模式。正则表达式语法与常见的正则表达式语法不同,特别是:

  • * + . ( ) [ ] { } \正常工作。
  • 仅当我们使用^$锚点来匹配模式中的第一个或最后一个字符时,它们才起作用。
  • 仅支持i (忽略大小写)修饰符标志

文字

使用/pattern/表示法将正则表达式文字引入到安全表达式中。要测试字符串是否符合正则表达式模式,请使用 string 的 matches 成员函数。以下匹配规则检查新数据是否以字符串 foo 开头。

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

支持的功能

Firebase 仅支持典型正则表达式功能的子集。然而,正则表达式语法应该很熟悉。

这些是支持的符号:

特点意义
\s \w \d \S \W \D用于匹配空格、单词字符或数字及其否定(分别)的预定义字符集
\ escape,后面的字符按字面解释。
如果你想匹配“”本身,也将其转义/\/
^锚定到字符串的开头。这只能用作模式的第一个字母。
/a/匹配“ba”,而/^a/则不匹配。
$锚定到字符串的末尾。这只能用作模式的最后一个字母。
/a/匹配“ab”,而/a$/则不匹配。
*匹配零个或多个前面的模式。
/^a*$/匹配“”和“aaa”,但不匹配“b”
+匹配一个或多个前面的模式。
/^a+$/匹配“a”和“aaa”,但不匹配“”
?匹配零个或一个前面的模式。
/^a?$/匹配“”和“a”,但不匹配“aa”
.匹配任何字符
/......../匹配“Firebase”
(pattern)括号将模式分组为一个单元
/(ab)*/匹配“abab”
a|b匹配 a 或 b
/a|bc/匹配“ac”或“bc”
[akz]字符集,匹配任何包含的字符。
/[ABCDEF]/仅匹配从 A 到 F 的大写字母。
[az]字符间隔,匹配指定范围内的所有字符。
/[0-9A-F]+/匹配十六进制字符串
[^0-9]前导^否定字符集,匹配指定字符集以外的任何内容。

正则表达式文字结构后面的i (例如/yes/i )表示匹配不区分大小写。目前不支持其他正则表达式修饰符。

Firebase 实时数据库安全规则中的正则表达式匹配既不是贪婪的也不是非贪婪的,因为它只允许您检测匹配而不捕获字符串的部分。

用法

要求字符串是 1900-2099 之间格式为 YYYY-MM-DD 的日期:

".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])$/)"

要求字符串是电子邮件地址:

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

要求字符串是基本 URL:

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