정규 표현식 리터럴을 사용하여 클라이언트에서 제공한 문자열의 유효성을 검사할 수 있습니다. 문자열이 정규 표현식 패턴을 준수하는지 테스트하려면 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) |
괄호는 패턴을 단일 단위로 그룹화합니다. /(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 실시간 데이터베이스 보안 규칙의 정규 표현식 일치는 일치 여부만 감지할 수 있고 문자열의 일부를 캡처할 수는 없으므로 탐욕적이지도 비탐욕적이지도 않습니다.
사용
문자열이 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\\-\\.\\?\\,\\'\\/\\\\+&=%\\$#_]*)?$/)"