Firebase 安全规则正则表达式

正则表达式字面量可用于验证客户端提供的字符串。使用 string.matches(/pattern/) 测试字符串是否符合某种正则表达式模式。正则表达式的语法与常用的正则表达式语法并不相同,尤其是:

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

字面量

使用 /pattern/ 表示法在安全表达式中引入正则表达式字面量。要测试字符串是否遵循正则表达式模式,请使用字符串的 matching 成员函数。以下匹配规则检查新数据是否以字符串 foo 开头。

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

支持的功能

Firebase 仅支持一部分典型的正则表达式功能。不过,您应该熟悉正则表达式的语法。

以下是支持的符号:

基于字符, 含义
\s \w \d \S \W \D 用于匹配空格、字词字符或数字的预定义字符集及其否定符号 (分别)
\ 转义,之后的字符将按字面解释。
如果您要匹配""对自身进行转义 /\/
^ 字符串开头。此名称只能用作模式的第一个字母。
/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。
[a-z] 字符间隔,匹配指定范围中的所有字符(包括这两个字符)。
/[0-9A-F]+/ 匹配十六进制字符串
[^0-9] 前导 ^ 用于否定字符集,与指定字符集以外的任何内容匹配。

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

Firebase Realtime Database Security Rules 中的正则表达式匹配既不贪心,也不贪心,因为它仅允许您检测匹配,而不允许捕获字符串的某些部分。

用法

字符串必须是介于 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)"

字符串必须是基本网址:

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