정규표현식이 느려서 프로그램이 멈추는 경우가 있다. 특히 백트래킹이 많은 패턴에서 그렇다.
백트래킹 문제
(a+)+ 같은 패턴에 aaaaaaaaaaaab를 매칭하면 엄청 오래 걸린다. 중첩된 수량자 때문에 경우의 수가 기하급수적으로 늘어난다. 정규표현식 테스터에서 직접 체험해보자.
해결책
중첩 수량자 피하기. (a+)+ 대신 a+ 쓰기. 필요하면 원자 그룹이나 소유 수량자 쓰기. 지원하는 엔진에서만 가능하다.
구체적인 패턴 사용
.* 보다 [^>]* 처럼 범위를 제한하면 백트래킹이 줄어든다. 가능한 구체적으로 쓰자. 테스터로 성능 차이를 비교해보면 좋다.
플래그 조합 활용
g, i, m 플래그를 상황에 맞게 조합해서 쓰면 더 유연하게 매칭할 수 있다. 대소문자 구분 없이 전역 검색하려면 gi를 쓰고, 여러 줄 처리가 필요하면 m을 추가하자. 정규표현식 테스터에서 플래그별 차이를 확인해보자.
캡처 그룹 효율적으로 쓰기
캡처 그룹이 많으면 성능에 영향을 줄 수 있다. 캡처가 필요 없는 그룹은 (?:...)로 비캡처 그룹으로 만들자. 정말 추출해야 하는 부분만 괄호로 감싸면 된다.
정규표현식 라이브러리 활용
자주 쓰는 패턴들은 라이브러리로 만들어져 있다. 이메일, 전화번호, URL 검증 같은 건 이미 검증된 패턴을 가져다 쓰는 게 안전하다. 테스터로 동작을 확인하고 사용하자.
정규표현식 테스터를 적극 활용해서 다양한 패턴을 실험해보자. 실전 경험이 쌓일수록 정규표현식 작성이 수월해진다.