VS Code 정규식 검색·치환으로 반복 수정 끝내기

2026. 9. 20. 13:00·IT
728x90
반응형

VS Code의 찾기 상자에서 정규식 토글 하나만 켜도 할 수 있는 일이 크게 늘어난다. 여기에 캡처 그룹까지 쓰면 손으로 스무 번 반복하던 수정이 한 번에 끝난다. 이 글은 정규식 문법 강의가 아니라, VS Code 검색·치환에서 실제로 쓰게 되는 기능과 함정을 다룬다. 정규식을 조금 아는 사람이 VS Code에서 더 써먹게 하는 것이 목적이다.

시작은 Alt+R, 그리고 캡처 그룹 $1

Ctrl+F가 찾기, Ctrl+H가 찾아 바꾸기다. 입력 상자 오른쪽에 토글이 세 개 있다. 대소문자 구분(Aa), 단어 단위(ab|), 그리고 정규식(.*)이다. 정규식 토글은 Alt+R로도 켠다. 이 상태가 아니면 .이나 *가 그냥 문자로 취급되니, 정규식이 안 먹는다 싶으면 이 토글부터 확인하면 된다.

정규식을 쓰는 진짜 이유는 캡처 그룹이다. 공식 문서 설명은 이렇다. "캡처 그룹은 치환 문자열에서 $n으로 참조하며, n은 캡처 그룹의 순서다."

실제 예를 보자. 로그 코드를 전부 로거로 바꿔야 한다고 하자.

console.log("user loaded", user);
console.log("order created", order);
console.log("payment failed", err);

찾기에 이렇게 넣는다.

console\.log\("(.+?)", (\w+)\);

바꾸기에는 이렇게 넣는다.

logger.info("$1", { $2 });

결과는 이렇다.

logger.info("user loaded", { user });
logger.info("order created", { order });
logger.info("payment failed", { err });

\.로 점을 이스케이프한 것, .+?로 최소 매칭을 쓴 것이 포인트다. .+를 쓰면 한 줄에 따옴표가 여러 개일 때 끝까지 먹어버린다.

대소문자를 바꿔주는 \u \U \l \L 은 의외로 덜 알려져 있다

치환할 때 캡처한 내용의 대소문자를 바꿀 수 있다. 문서가 명시한 수정자는 네 개다. "\u와 \l은 한 글자를 대문자/소문자로 만들고, \U와 \L은 나머지 전체를 대문자/소문자로 만든다."

스네이크 케이스를 상수 이름으로 바꾸는 작업이 딱 맞는 예다.

찾기:   ^(\w+)$
바꾸기: const \U$1\E = "$1";

\U 뒤부터 대문자가 되고 \E에서 끝난다. 앞서 멀티 커서로 하던 작업을 정규식으로는 이렇게 한 번에 처리한다.

카멜 케이스의 첫 글자만 올리는 것도 자주 쓴다.

찾기:   get_(\w)(\w+)
바꾸기: get\u$1$2

get_name이 getName이 된다. 이 수정자들을 모르면 치환한 뒤에 대소문자를 다시 손보게 되는데, 그러면 두 번 일하는 셈이다.

여러 줄에 걸친 패턴도 찾을 수 있다

찾기 상자는 한 줄짜리로 보이지만 여러 줄을 넣을 수 있다. 문서는 "찾기 입력 상자와 바꾸기 입력 상자에 텍스트를 붙여넣어 여러 줄 텍스트를 검색할 수 있다. Ctrl+Enter를 누르면 입력 상자에 새 줄이 삽입된다"고 설명한다.

정규식 모드에서는 \n을 직접 써도 된다. 예를 들어 빈 줄이 두 줄 이상 연속된 것을 하나로 줄이려면 이렇게 한다.

찾기:   \n{3,}
바꾸기: \n\n

주석 블록을 통째로 지우는 것도 가능하다.

찾기:   /\*\*[\s\S]*?\*/\n
바꾸기: (비움)

[\s\S]는 줄바꿈을 포함한 모든 문자를 뜻한다. 정규식에서 .은 기본적으로 줄바꿈을 안 먹기 때문에 이 관용구를 쓴다.

여러 줄 치환은 되돌리기가 까다로우니, 실행 전에 몇 건이 잡히는지 숫자를 꼭 확인하자. 찾기 상자 오른쪽에 "3 of 12" 같은 식으로 표시된다.

파일 전체 검색은 glob 패턴으로 범위를 좁힌다

Ctrl+Shift+F는 열려 있는 폴더 전체를 검색한다. 여기서 중요한 것은 포함/제외 패턴이다. 입력란 아래 점 세 개를 누르면 "files to include"와 "files to exclude"가 나온다.

문서가 정리한 glob 규칙은 이렇다. *는 한 경로 구간에서 문자 0개 이상, **는 경로 구간 몇 개든, {}는 조건 묶음, []는 문자 범위다.

실제로 쓰는 형태는 대략 이렇다.

포함: src/**/*.{ts,tsx}
제외: **/node_modules,**/dist,**/*.test.ts

테스트 파일을 빼고 소스만 보고 싶을 때, 혹은 특정 디렉터리만 보고 싶을 때 이 두 칸이 검색 시간을 크게 줄인다. 제외 패턴은 앞서 설정 글에서 다룬 search.exclude에 넣어두면 매번 치지 않아도 된다.

검색 결과 패널에서 바로 치환할 수도 있다. 결과 목록의 각 항목 옆에 있는 바꾸기 아이콘으로 하나씩 적용하거나, 전체 바꾸기를 누른다. 전체 바꾸기는 파일을 저장하지 않은 상태로 열어두므로, 결과가 마음에 안 들면 Ctrl+Z나 창을 닫아서 되돌릴 수 있다. 이 점이 터미널에서 sed -i를 돌리는 것보다 안전하다.

손에 익혀두면 계속 쓰게 되는 패턴 몇 가지

매번 새로 만들기보다 형태를 외워두는 편이 빠르다. 자주 쓰는 것들을 모았다.

목적 찾기 바꾸기
줄 끝 공백 제거 [ \t]+$ (비움)
빈 줄 3개 이상을 2개로 \n{3,} \n\n
마크다운 링크에서 URL만 남기기 \[([^\]]+)\]\(([^)]+)\) $2
큰따옴표를 작은따옴표로 (문자열만) "([^"\n]*)" '$1'
import 경로에서 확장자 떼기 (from\s+'[^']+)\.js' $1'
스네이크를 카멜로 _(\w) \u$1
콘솔 로그만 골라 지우기 ^\s*console\.log\(.*\);?\n (비움)

마지막 패턴은 앞서 말한 주의사항이 그대로 적용된다. 문자열 안에 console.log(가 들어 있거나 여러 줄에 걸친 호출은 못 잡는다. 건수를 먼저 확인하고 결과를 훑어본 뒤에 실행해야 한다.

^와 $는 VS Code 검색에서 줄 단위로 동작한다. 줄 시작과 끝을 뜻하므로 들여쓰기까지 포함해 지우려면 ^\s*처럼 앞에 공백 패턴을 붙인다.

파일 이름에도 같은 규칙이 통한다

Ctrl+P로 파일을 여는 창에서도 필터링이 된다. 여기서는 정규식이 아니라 퍼지 매칭이다. usrctl이라고 치면 user-controller.ts가 잡힌다. 경로 일부를 넣어도 된다. api/user처럼 슬래시를 포함해 치면 그 경로 아래 파일로 좁혀진다.

이 창에서 쓸 수 있는 접두사도 알아두면 좋다. @를 치면 현재 파일의 심볼 목록이 뜨고, @:를 치면 종류별로 묶어서 보여준다. #을 치면 워크스페이스 전체 심볼을 찾는다. :에 숫자를 치면 그 줄로 이동한다. 파일 이름을 친 뒤 :120을 붙이면 그 파일의 120번째 줄로 바로 간다.

검색과 이동을 섞어 쓰면 마우스에 손이 갈 일이 크게 준다. 나는 파일 탐색기를 거의 안 쓰고 Ctrl+P와 Ctrl+Shift+F만으로 돌아다닌다. 프로젝트가 커질수록 트리를 펼쳐 내려가는 것보다 이름으로 바로 찾는 쪽이 빠르다.

정규식으로 하면 안 되는 일도 분명히 있다

여기까지 읽으면 정규식으로 다 될 것 같지만, 나는 선을 긋는 편이다. 구조를 가진 텍스트를 정규식으로 다루면 언젠가 사고가 난다.

HTML이나 JSON을 정규식으로 파싱하는 것이 대표적이다. 중첩이 있는 문법은 정규식이 표현할 수 있는 범위를 벗어난다. 겉보기에 동작하다가 중첩이 한 단계 깊어지는 순간 엉뚱한 곳을 잡는다.

코드의 심볼 이름 변경도 마찬가지다. Ctrl+Shift+F로 getUser를 찾아 바꾸면 주석 안의 getUser, 문자열 리터럴 안의 getUser, 다른 모듈의 동명이인까지 같이 바뀐다. 이건 F2(이름 바꾸기)가 할 일이다. 언어 서버가 문법을 이해하고 바꾸므로 정확하다.

그러면 정규식은 언제 쓰나. 문법이 아니라 형태가 반복되는 텍스트일 때다. 로그 포맷, 설정 파일의 키 이름, 마크다운 링크, CSV 조각, 커밋 메시지 목록 같은 것들이다. 이런 건 구조가 평평해서 정규식이 정확히 맞는다.

확인하고 바꾸는 습관이 결국 시간을 아낀다

정규식 치환에서 가장 흔한 사고는 "전체 바꾸기를 눌렀는데 예상보다 많이 바뀐 것"이다. 이걸 막는 방법은 단순하다.

먼저 찾기만 해서 건수를 본다. 예상과 다르면 패턴이 잘못된 것이다. 다음으로 Enter로 결과를 하나씩 넘겨보며 엉뚱한 게 잡히지 않는지 확인한다. 그다음에야 바꾼다. 급하면 Ctrl+Alt+Enter로 전체 바꾸기가 되지만, 나는 파일이 여러 개일 때는 항상 결과 목록을 훑고 나서 누른다.

그리고 치환 전에 커밋하거나 최소한 저장해 두자. Git이 되돌려 줄 수 있는 상태라면 정규식을 훨씬 과감하게 쓸 수 있다. 도구를 겁 없이 쓰려면 안전망이 먼저 있어야 한다.

참고 자료

  • Basic Editing — Visual Studio Code Docs — 찾기·바꾸기 옵션, 캡처 그룹 $n, 대소문자 수정자, 여러 줄 검색, glob 패턴
  • User and workspace settings — Visual Studio Code Docs — search.exclude 로 검색 범위를 미리 줄이는 방법
728x90
반응형

'IT' 카테고리의 다른 글

VS Code launch.json 디버깅 설정 정리  (0) 2026.09.21
Jev 모델 정리 — 속도보다 과금 구조가 진짜 변화다  (0) 2026.09.21
VS Code 설정, 사용자 설정과 워크스페이스 설정 구분  (0) 2026.09.19
VS Code 멀티 커서, 상황별로 골라 쓰는 법  (0) 2026.09.18
WSL 한글 폰트 sudo 없이 설치하고 Pillow로 썸네일 만들기  (0) 2026.09.17
'IT' 카테고리의 다른 글
  • VS Code launch.json 디버깅 설정 정리
  • Jev 모델 정리 — 속도보다 과금 구조가 진짜 변화다
  • VS Code 설정, 사용자 설정과 워크스페이스 설정 구분
  • VS Code 멀티 커서, 상황별로 골라 쓰는 법
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (451) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (54) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    svelte
    ssl 인증서 발급
    자바 생성자
    Rust lang
    css tb
    React Compiler
    gitlab 설치
    rust linux
    docker
    jsp parameter
    servlet class
    자바 객체 지향
    러스트
    css transition
    css perspective
    자바 exception
    css float
    ubuntu
    브라우저 자동화
    API 설계
    SSL 인증서
    자바 배열
    nginx ssl 설정
    nginx
    제미나이
    java casting
    프런트엔드
    에디터 팁
    proxy pass
    자바 클래스
    티스토리 자동화
    리눅스 설치
    Java Array
    자바 for문
    AI 코딩 에이전트
    spring java
    Node
    vue cli
    nginx ssl 적용
    클론코딩
    AI 반도체
    jsp include
    lang rust
    vscode
    css table
    VS Code 팁
    Extension Bisect
    오류
    mysql db
    vue 설치
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
VS Code 정규식 검색·치환으로 반복 수정 끝내기
상단으로

티스토리툴바