정규 표현식 리터럴은 클라이언트 제공 문자열의 유효성을 검사하는 데 사용할 수 있습니다. string.matches(/pattern/)
를 사용하여 문자열이 정규 표현식 패턴을 준수하는지 테스트합니다. 정규 표현식 구문은 일반적인 정규 표현식 구문과 동일하지 않으며 특히 다음과 같은 특징이 있습니다.
*
+
.
(
)
[
]
{
}
\
은(는) 정상적으로 작동합니다.^
및$
앵커는 패턴의 첫 번째 또는 마지막 문자와 일치시키기 위해 사용하는 경우에만 작동합니다.i
(대소문자 무시) 특수키 플래그만 지원됩니다.
리터럴
정규 표현식 리터럴은 /pattern/
표기법을 사용하여 보안 표현식에 사용됩니다. 문자열이 정규 표현식 패턴을 준수하는지 테스트하려면 문자열의 match 멤버 함수를 사용합니다. 다음 일치 규칙은 새 데이터가 문자열 foo로 시작하는지 여부를 확인합니다.
".validate": "newData.val().matches(/^foo/)"
지원되는 기능
Firebase는 일반적인 정규 표현식 기능의 일부만 지원합니다. 정규 표현식 문법이 익숙할 것입니다.
지원되는 기호는 다음과 같습니다.
문자 기반이란 | 의미 |
---|---|
\s \w \d \S \W \D |
공백, 단어 문자 또는 숫자와 그 부정을 매칭하기 위한 사전 정의된 문자 집합 (각각) |
\ |
이스케이프 문자 다음에 오는 문자는 문자 그대로 해석됩니다. ""에서 일치시키려면 그 자체도 이스케이프 처리 /\/
|
^ |
문자열의 시작 부분에 고정합니다. 패턴의 첫 글자로만 사용할 수 있습니다.
/a/ 는 'ba'와 일치하지만 /^a/ 은 일치하지 않습니다.
|
$ |
앵커에 추가합니다. 패턴의 마지막 문자로만 사용할 수 있습니다. /a/
'ab'와 일치하지만 /a$/ 은 일치하지 않습니다.
|
* |
선행 패턴과 0개 이상과 일치합니다. /^a*$/ 이(가) ""과(와) 일치합니다. 'aaa' 및 'b' 제외
|
+ |
앞의 패턴 중 하나 이상과 일치합니다. /^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 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)"
문자열을 기본 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"