正则表达式字面量可用于验证客户端提供的字符串。使用 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"