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

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

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

リテラル

正規表現リテラルは、/pattern/ 表記を使用してセキュリティ式に導入されます。文字列が正規表現パターンに準拠しているかどうかをテストするには、文字列の matches メンバー関数を使用します。次の 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) かっこはパターンを 1 つの単位にグループ化します。
/(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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"