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