플래그 넷이 하는 일
g를 끄면 첫 매치 하나만 찾습니다. 개수를 세거나 전부 바꿀 때는 켜야 합니다.
i는 대소문자를 무시합니다. m은 ^와 $가 문자열 전체가 아니라 줄마다 걸리게 합니다. 여러 줄 로그에서 줄머리를 잡을 때 씁니다.
s는 .이 줄바꿈에도 걸리게 합니다. .은 기본적으로 줄바꿈을 빼고 세므로, 여러 줄에 걸친 덩어리를 통째로 잡으려면 이 플래그가 필요합니다.
자주 쓰는 조각
\d숫자,\w글자와 숫자와 밑줄,\s공백류. 대문자로 쓰면(\D\W\S) 반대가 됩니다.+는 하나 이상,*는 없어도 됨,?는 있거나 없거나,{2,4}는 두 번에서 네 번.^는 시작,$는 끝,\b는 낱말 경계입니다.(...)는 캡처 그룹이라 결과에 따로 담기고,(?:...)는 묶기만 합니다.(?<name>...)으로 이름을 주면 번호 대신 이름으로 꺼낼 수 있습니다.
탐욕적 수량자와 게으른 수량자
.*는 갈 수 있는 데까지 가고 나서 뒤로 물러섭니다. <b>하나</b><b>둘</b>에 <b>.*</b>를 걸면 처음부터 끝까지 통째로 하나로 잡힙니다.
?를 붙여 <b>.*?</b>로 만들면 가능한 짧게 멈추므로 두 개로 나뉩니다. 태그나 따옴표 안을 집어낼 때는 대개 이쪽이 맞습니다.
왜 별도 스레드에서 돌리는가
수량자가 겹치면 정규식이 폭주할 때가 있습니다. (a+)+b에 a만 서른 개쯤 준 경우가 그렇습니다. 엔진이 a를 나누는 모든 조합을 되짚어 보느라 경우의 수가 자릿수로 늘어납니다. 짧은 입력인데도 몇 분씩 걸립니다.
이 도구는 정규식을 화면과 다른 스레드에서 돌리고, 1초가 넘으면 그 스레드를 통째로 끝냅니다. 한 번의 계산 안에서 벌어지는 일이라 중간에 멈춰 세울 방법이 없기 때문입니다. 그래서 폭주하는 패턴을 넣어도 화면은 그대로 움직입니다.
같은 일이 서버에서 벌어지면 요청 하나가 CPU를 붙잡습니다. 사용자 입력을 정규식에 넣는 코드라면 겹친 수량자가 없는지 특히 살펴보세요.
언어마다 문법이 다릅니다
여기서 쓰는 것은 자바스크립트 정규식입니다. 뒤돌아보기((?<=...))는 최신 브라우저에서 되지만, 재귀나 원자 그룹처럼 PCRE에만 있는 기능은 없습니다.
파이썬은 이름 있는 그룹을 (?P<name>...)으로 적고, 자바는 역슬래시를 문자열에서 한 번 더 감싸야 합니다. 여기서 다듬은 패턴을 옮길 때는 그 언어의 표기로 바꿔 주세요.