JScript의 역참조
업데이트: 2007년 11월
정규식의 가장 중요한 기능은 일치하는 패턴의 일부를 나중에 다시 사용하기 위해 저장하는 기능입니다. 이미 알고 있듯이 정규식 패턴이나 패턴의 일부를 괄호로 묶으면 식의 일부가 임시 버퍼에 저장됩니다. 비캡처링 메타문자인 ?:나 ?=, ?!를 사용하여 캡처를 재정의할 수 있습니다.
역참조 사용
캡처된 부분 일치는 정규식 패턴에서 왼쪽으로 오른쪽으로 발견된 순서대로 저장됩니다. 버퍼 수는 캡처된 부분 일치의 1에서 시작하여 99까지 계속됩니다. 각 버퍼는 \n을 사용하여 액세스할 수 있는데 여기서 n은 특정 버퍼를 식별하는 한 자리 또는 두 자리 10진수입니다.
역참조의 가장 단순하고 유용한 응용 프로그램 중 하나는 텍스트에서 두 개의 동일한 인접 단어의 사용을 찾는 기능을 제공합니다. 다음 문장을 사용해 봅니다.
Is is the cost of of gasoline going up up?
위의 문장에는 분명히 여러 개의 중복된 단어가 있습니다. 단어마다 중복된 내용은 찾지 않도록 해당 문장을 수정할 수 있는 방법이 있으면 좋을 것입니다. 다음 정규식에서는 그러한 작업을 위해 단일 부분식을 사용합니다.
/\b([a-z]+) \1\b/gi
[a-z]+에서 지정한 대로 캡처된 식은 하나 이상의 영문자를 포함합니다. 정규식의 두 번째 부분은 앞에서 캡처된 부분 일치, 즉 괄호 식에서 찾은 단어의 두 번째 사용에 대한 참조입니다. \1은 첫 번째 부분 일치를 지정합니다. 단어 경계 메타문자는 단어 단위로만 찾게 합니다. 그렇지 않은 경우 "is issued"나 "this is"와 같은 구는 이 식에 의해 잘못 식별될 수 있습니다.
정규식 다음에 오는 global 플래그(g)는 입력 문자열에서 찾을 수 있는 일치 항목에 적용될 수 있는 식을 나타냅니다. 식의 끝에 있는 대/소문자를 구분하지 않음(i) 플래그는 대/소문자를 구분하지 않음을 지정합니다. 여러 줄 입력 가능한 플래그는 줄 바꿈 문자의 어느 쪽에서나 잠재적 일치가 나타날 수 있음을 지정합니다.
위의 정규식을 사용하면서 다음 코드에서는 부분 일치 정보를 사용하여 텍스트 문자열에서 연속적으로 같은 단어가 두 개 사용한 것을 동일한 단어의 단일 사용으로 바꿀 수 있습니다.
var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim; //Create regular expression pattern.
var rv = ss.replace(re,"$1"); //Replace two occurrences with one.
replace 메서드 내에서 $1을 사용하면 처음으로 저장된 부분 일치를 참조합니다. 부분 일치가 여러 개 있으면 $2, $3 등을 사용하여 연속적으로 부분 일치를 참조할 수 있습니다.
역참조를 사용하면 URI(Universal Resource Indicator)를 해당 구성 요소별로 나눌 수 있습니다. 다음 URI를 프로토콜(ftp, http 등), 도메인 주소 및 페이지/경로로 구분한다고 가정합니다.
https://msdn.microsoft.com:80/scripting/default.htm
다음 정규식에서는 그러한 기능을 제공합니다.
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
처음에 나온 괄호의 부분식은 웹 주소의 프로토콜 부분을 캡처합니다. 해당 부분식에서는 콜론과 두 개의 슬래시 앞에 오는 단어를 찾습니다. 두 번째 괄호의 부분식은 해당 주소의 도메인 주소를 캡처합니다. 해당 부분식에서는 / 또는 :가 아닌 하나 이상의 문자를 찾습니다. 세 번째 괄호의 부분식은 포트 번호가 지정되어 있으면 포트 번호를 캡처합니다. 해당 부분식에서는 콜론 다음에 오는 0개 이상의 숫자를 찾습니다. 이 부분식은 한 번만 반복할 수 있습니다. 마지막으로 네 번째 괄호의 부분식은 웹 주소에서 지정한 경로 및/또는 페이지 정보를 캡처합니다. 해당 부분식에서는 #이나 공백 문자가 포함되지 않은 문자의 시퀀스를 찾습니다.
위의 URI에 정규식을 적용하면 부분 위치에 다음 내용이 포함됩니다.
RegExp.$1에는 "http"가 포함됩니다.
RegExp.$2에는 "msdn.microsoft.com"이 포함됩니다.
RegExp.$3에는 ":80"이 포함됩니다.
RegExp.$4에는 "/scripting/default.htm"이 포함됩니다.