데이터베이스마다 정규식 연산자와 엔진이 달라
- PostgreSQL:
~,~*,!~,!~*연산자를 제공하고 POSIX ERE를 확장한 ARE 방언을 사용해. - MySQL 8:
REGEXP와RLIKE를 제공하고 ICU 정규식 엔진을 사용해. - MariaDB: 연산자 이름은 비슷하지만 PCRE 계열 엔진과 버전별 설정을 사용하므로 MySQL과 같은 문법이라고 가정하면 안 돼.
- SQLite:
REGEXP를 사용하려면 확장을 불러오거나 사용자 정의 함수를 등록해야 해. - Snowflake:
RLIKE,REGEXP_LIKE,REGEXP_SUBSTR,REGEXP_REPLACE등을 제공해.
regexp_replace, regexp_substr, regexp_count처럼 비슷한 이름의 함수도 세부 인수와 방언은 다를 수 있어. 사용하는 데이터베이스 문서를 기준으로 확인해.
유니코드 입력은 축약 클래스의 차이를 드러내
- Python
re: 기본\d,\w,\s는 유니코드를 인식하고re.ASCII로 제한할 수 있어. - JavaScript: 유니코드 코드 포인트 처리를 위해
/u를 사용해도\w는 ASCII 중심이야. 문자 범주에는\p{L}같은 속성 이스케이프를 써. - RE2와 Go: 축약 클래스는 ASCII 의미를 사용하고, 유니코드 범주는
\p{Nd}나\pL처럼 적어. - PCRE: 유니코드 속성 의미에는
(*UCP)나PCRE2_UCP가 필요하고, 비 ASCII 코드 포인트를 처리할 UTF 모드도 따로 확인해야 해.
유니코드 데이터를 다룬다면 ASCII 예시만 통과한 것으로 끝내지 말고 한글, 확장 숫자, 이모지 같은 실제 입력도 시험해.
성능은 패턴과 입력을 함께 보고 판단해
- 반복해서 쓸 패턴은 컴파일 결과를 재사용해.
- 시작 위치가 정해져 있다면 앵커나 전체 일치 API로 검색 범위를 줄여.
- 한 글자 후보는
a|b|c보다[abc]처럼 문자 클래스로 표현해. (a+)+,(a|a)+,(.*)*처럼 모호한 반복이 겹치는 패턴은 파국적 백트래킹을 검사해.- 큰 파일은 통째로 메모리에 올리지 말고 줄이나 조각 단위로 읽어.
finditer가 결과를 지연 생성해도 입력 문자열 자체를 대신 스트리밍해 주지는 않아.
공통 개념을 익히되 실행 엔진을 잊지 마
패턴이 입력을 따라 이동한다는 기본 모형은 어디서나 통하지만, 지원 문법과 문자 범위는 엔진마다 달라. 먼저 호환성이 높은 문법으로 요구사항을 표현하고, 전용 기능이 필요해질 때 대상 엔진의 문서를 확인해.