Realtime Database セキュリティ ルールで正規表現を使用する

正規表現リテラルを使用して、クライアントから提供された文字列を検証できます。string.matches(/pattern/) を使用して、文字列が正規表現パターンに準拠しているかどうかをテストします。正規表現の構文は、一般的な正規表現の構文と同一ではありません。特に、次の点が異なります。

  • * + . ( ) [ ] { } \ は通常どおり動作します。
  • ^ アンカーと $ アンカーは、パターン内の最初または最後の文字を照合するために使用する場合にのみ機能します。
  • i(大文字と小文字の区別を無視)修飾子フラグのみがサポートされています

リテラル

正規表現リテラルは、/pattern/ 表記を使用してセキュリティ式に導入されます。文字列が正規表現パターンに準拠しているかどうかをテストするには、文字列の matches メンバー関数を使用します。次の一致ルールは、新しいデータが文字列 foo で始まるかどうかを確認します。

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

サポートされる機能

Firebase は、一般的な正規表現機能の一部のみをサポートしています。ただし、正規表現の構文は使い慣れたもののはずです。

サポートされている記号は次のとおりです。

文字 意味
\s \w \d \S \W \D 空白文字、単語文字、数字、およびそれらの否定(それぞれ)に一致する事前定義された文字セット
\ エスケープ。次の文字はリテラルとして解釈されます。
「"」自体を照合する場合は、これもエスケープします /\/
^ 文字列の先頭にアンカーします。これは、パターンの最初の文字としてのみ使用できます。
/a/ は「ba」に一致しますが、/^a/ は一致しません。
$ 文字列の末尾にアンカーを設定します。これは、パターンの最後の文字としてのみ使用できます。
/a/ は「ab」に一致しますが、/a$/ は一致しません。
* 直前のパターンの 0 回以上の繰り返しに一致します。
/^a*$/ は「」と「aaa」に一致しますが、「b」には一致しません。
+ 直前のパターンの 1 回以上の繰り返しに一致します。
/^a+$/ は「a」と「aaa」に一致しますが、「」には一致しません。
? 直前のパターンの 0 回または 1 回の繰り返しに一致します。
/^a?$/ は「」と「a」に一致しますが、「aa」には一致しません。
. 任意の文字に一致します。
/......../ は「Firebase」に一致します。
(pattern) 括弧はパターンを単一の単位にグループ化します。
/(ab)*/ は「abab」に一致します。
a|b a または b に一致します。
/a|bc/ は「ac」または「bc」に一致します。
[akz] 文字セット。含まれる任意の文字に一致します。
/[ABCDEF]/ は、A ~ F の大文字のみに一致します。
[a-z] 文字間隔。指定された範囲内のすべての文字に一致します。
/[0-9A-F]+/ 16 進数の文字列と一致します
[^0-9] 先頭の ^ は文字セットを否定し、指定された文字セット以外のものに一致します。

正規表現リテラル構築の末尾にある i(例: /yes/i)は、大文字と小文字を区別しない一致を示します。現時点では、他の正規表現修飾子はサポートされていません。

Firebase Realtime Database セキュリティ ルールでの正規表現マッチングは、文字列の一部をキャプチャするのではなく、一致を検出することのみを許可するため、貪欲でも非貪欲でもありません。

用途

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