정규식의 캡처 그룹(capture group) 안에서 특정 문자를 직접 건너뛰는 것은 불가능합니다. 정규식의 매칭 결과는 항상 연속적이어야 하며, 전방 탐색이나 후방 탐색 같은 너비 0 단언(zero-width assertion)을 사용하더라도 이 규칙은 예외 없이 적용됩니다.
그럼 어떻게 해야 할까요?
다행히 해결 방법이 있습니다. 바로 비캡처 그룹(non-capturing group), 즉 (?:...) 문법을 활용하는 것입니다. 비캡처 그룹을 사용하면 해당 패턴을 매칭에는 포함시키면서, 최종 캡처 결과에서는 제외할 수 있습니다. 이를 통해 접두사나 주변 문자열을 걷어내고 원하는 부분만 깔끔하게 추출할 수 있습니다.
예제
아래 코드는 "Username akdg_amit"이라는 문자열에서 akdg_라는 접두사를 제외한 실제 사용자 이름만 캡처하는 예제입니다.
<html>
<head>
<script>
var str = "Username akdg_amit";
var myReg = /(?:^|\s)akdg_(.*?)(?:\s|$)/g;
var res = myReg.exec(str);
document.write(res[1]);
</script>
</head>
<body>
</body>
</html>
코드 설명
위 정규식 패턴을 하나씩 살펴보면 다음과 같습니다.
(?:^|\s)— 문자열 시작 또는 공백 문자를 매칭하되, 캡처하지 않습니다. 즉, 토큰의 경계를 확인하는 역할만 합니다.akdg_— 실제로 제거하고 싶은 접두사입니다. 매칭에는 포함되지만 별도의 캡처 그룹으로 감싸지 않았기 때문에 결과에서 제외됩니다.(.*?)— 여기가 핵심 캡처 그룹입니다. 접두사 뒤에 오는 모든 문자를 최소 일치(lazy matching) 방식으로 캡처합니다.(?:\s|$)— 공백 또는 문자열 끝을 매칭해 토큰의 끝을 확인하며, 마찬가지로 캡처하지 않습니다.
따라서 res[1]에는 akdg_amit 전체가 아닌, 접두사가 제거된 amit만 저장됩니다. 이처럼 캡처 그룹 자체에서 문자를 '건너뛰는' 대신, 필요 없는 부분을 비캡처 그룹으로 처리하면 원하는 값만 정확하게 추출할 수 있습니다.