Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 정규식(RegExp) 캡처 그룹에서 특정 문자를 제외하고 추출하는 방법

정규식의 캡처 그룹(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만 저장됩니다. 이처럼 캡처 그룹 자체에서 문자를 '건너뛰는' 대신, 필요 없는 부분을 비캡처 그룹으로 처리하면 원하는 값만 정확하게 추출할 수 있습니다.