[Regular Expression] 단어 단위 매칭을 하는 정규표현식 파이프(|)

단일 문자를 선택적으로 일치하는 문자 클래스를 단어 단위(또는 정규 표현식)로 확장해주는 메타문자(또는 연산자)입니다. 요약하면 나열한 단어(또는 정규 표현식)들 중 일치하는 하나를 선택하는 단어단위 or 연산자의 의미입니다.

/감자|고구마|옥수수/로 정규 표현식을 정의할 수 있고, “감자”, “고구마”, “옥수수” 중 가장 먼저 일치하는 단어를 선택합니다. “g” 플래그를 사용해 문자열 전역으로 일치하면 “감자”, “고구마”, “옥수수” 단어를 모두를 일치합니다.

파이프는 정규 표현식 연산자 중에서 우선 순위가 가장 낮습니다. 다른 메타문자, 또는 연산자를 모두 실행하고 가장 나중에 파이프로 나열한 문자열(또는 정규 표현식)에서 일치하는 것을 찾게 됩니다.

파이프로 나열한 여러 단어(또는 정규 표현식) 중 일치하는 것이 여러 개일 경우 왼쪽의 것이 우선 순위가 있게 됩니다. 즉, 왼쪽에서부터 가장 먼저 일치하는 단어가 반환되고, 파이프를 통한 선택적 일치는 종료됩니다.

/reply|replyTo|forward|forwardTo/로 메일 본문 안의 내용을 일치할 때, “reply To:email@domain.com” 문자열은 “reply”를 일치하고 선택적 일치를 종료합니다.

따라서 선택적 일치를 할 때 더 길게 일치하는 단어(또는 정규 표현식)을 왼쪽에 배치를 해야 원하는 파이프 선택 결과를 얻을 수 있습니다.

앞서의 정규 표현식은 /replyTo|forwardTo|reply|forward/로 순서를 변경해야 정규 표현식으로 일치하는 최대한의 결과를 얻을 수 있습니다.

그리고 앞서의 단순 나열보다는 중복되는 단어들을 하나로 묶어서 /(reply|forward) (To)?/처럼 최적화를 할 수도 있습니다.

캡처 그룹(소괄호) 사용에 대해서는 바로 이어서 더 자세히 배우게 됩니다. 여기서는 수식에 괄호를 적용하는 것처럼 정규 표현식의 일치 우선 순위를 부여한다고 이해하면 됩니다.

중요한 것은 괄호로 그룹을 지어서 우선 순위를 적절하게 구분해주지 않으면 원하는 매치가 되지 않게 된다는 것입니다.

앞의 정규 표현식에서 소괄호를 제거하고 /reply|forward(To)?/로 정규 표현식을 작성하면 “replyTo”에서 “reply”만 매치되고 “To”는 “forwardTo”에만 매치됩니다.

앞서 설명했듯이 파이프(|)는 우선 순위가 가장 낮기 때문에 괄호가 없는 정규 표현식은 “reply”와 “forward(To)?” 두 개만 선택적으로 일치하게 됩니다. “(To)?” 정규 표현식이 파이프보다 먼저 실행되기 때문에 선행하는 “forward” 단어에 “(To)?”가 종속되게 됩니다.