본문 바로가기
목차
utils

Vim Regular Expression

by ds31x 2026. 2. 18.
728x90
반응형

Vim Regular Expression

Vim에서의 RE(Regular Expression) 은 Python이나 C에서의 RE 와 조금 차이가 있다.


참고로 Vim의 RE는 backslash가 무지 많이 요구되기 때문에,

일반적으로 very magic 모드(\v)를 사용하는 게 정신건강에 좋다.

  • 가급적 기호를 regular expression의 special character(meta character)로 해석하게 됨.
  • backslash를 통한 escape를 안해줘도 됨.

우선 이 문서에선 기본 동작으로 설명하지만, very magic mode 가 훨씬 편하므로 반드시 very magic mode 로 사용하는 것을 연습해두기리 권함.

 

Python 등의 re모듈에서 기본적으로 meta character 인 다음의 문자들이 vim에선 일반 문자로 취급된다.

+ ? | ( )

 

때문에 이를 meta character 로 쓰려면, backslash로 escape 시켜야 함.

\+ \? \| \( \)

 

backslash없이 metacharacter로 동작하는 건 다음 정도임:

. ^ $ *
  • period는 newline을 제외한 여러 문자들 중 하나를 의미.
  • caret은 square bracket 안에선 not을 의미하고 아닌 경우엔 한 줄의 시작을 의미함.
  • dollar는 한 줄의 끝을 의미.
  • asterisk는 0개 이상을 나타내는 qunatifier

기본 매칭

hello

위와 같이 일반 글자의 패턴은 말 그대로 hello 문자열을 찾음.

 

RE의 장점은 다음의 meta characters를 통해 활용가능함.

  • . : period
    • newline (\n)을 제외한 임의의 문자 1개를 의미: single character
    • a.c: abc, axc 등에 매칭됨.

Quantifier

quantifier는 특정 글자나 패턴이 얼마나 반복되는지를 나타냄.

Meaning Vim default
zero or more *
one or more \+
zero or one \?
exactly n \{n}
n or more \{n,}
n to m \{n,m}

 

다음은 1개 이상의 숫자를 나타내는 패턴임:

\d\+
  • \d 는 Vim의 RE에서 digit (숫자) 문자 하나를 의미하는 class임.

Vim Classes

다음은 Vim에서 자주 사용되는 클래스임 (사실 Python의 re에서도 많이 사용됨)

Meaning Pattern
digit \d
not digit \D
word char \w
whitespace \s
alphabet \a
uppercase \u
lowercase \l

 

RE에서 흔히 사용되는 Character Class는 square bracket을 이용함:

[abc]
  • 이 경우, a,b,c 세 글자 중 한 글자가 있는 패턴을 의미함.
[^abc]
  • 앞의 caret에 의해 not이 되어 a,b,c를 제외한 한글자가 있는 패턴이 됨.
[a-z]
  • dash를 통해 범위를 표현할 수도 있으나, 이 경우 locale의 철자 순서를 따르므로 주의해야함.
  • 철저한 ASCII로 동작하려면 export LANG=C 또는 export LANG=ANSI를 사용하는 것을 권함.

Alternation (OR)

\| 는 or로 동작함.

\(cat\|dog\)

 

예를 들어 다음의 pattern은 Korea와 korea에 모두 매칭됨

\(K|k\)orea

 


Group and Capture

Parenthesis를 사용하여 capture group을 지정하는 RE와 같으나, opening parenthesis와 closing parenthesis 앞에 backslash가 요구된다.

\(\w\+\) \(\w\+w)
  • 2개의 단어를 나타내는 패턴을 의미
  • 패턴을 나타낼 때 사용되는 스페이스는 구분을 의미하므로 패턴에서 스페이스 그대로를 의미하려면 backslash와 스페이스를 같이 붙여 기재하여 표현.
  • 각 단어가 capture group1 과 capture group2로 캡처됨.

Vim의 :s (substitution)을 통해 다음과 같이 2개의 단어의 순서를 바꿀 수 있음.

:s/\(\w\+\) \(\w\+w)/\2 \1/
  • 현재 line에서 첫 단어와 두번째 단어가 위치를 바꿈.

Anchor

Anchor는 문자 자체를 소비하지 않고(match length = 0) 특정 위치를 지정하는 특수한 문자를 가리킴.

  • 매칭 위치를 찾는데만 사용됨.
  • match 범위를 바꾸지는 않음
  • regex engine이 현재 위치가 조건을 만족하는지 확인만 할 뿐, 매칭 결과물에 포함되지 않음.

다음이 대표적인 anchor임.

anchor 의미
^ 줄 시작
$ 줄 끝
\< 단어 시작
\> 단어 끝

Vim 전용 기능: \zs, \ze, {-}

매칭 결과물의 위치를 지정하는 match boundary modifer로 \zs, \ze를 vim은 지원함.

  • \zs = match start 재설정
  • \ze = match end 재설정
:s/H\zsello/i/
  • Hello 문자열을 찾지만, 매칭 결과물은 ello가 됨.
  • elloi로 치환되어 결국 Hi가 되게 함.

다음의 예는 path에서 파일명을 추출해냄:

.*/\zs[^/]+$

{-} 은 minimal repeat 로 Python등의 RE의 *?랑 같은 역할을 함.

  • 가능한 최소 반복을 찾아냄.
  • 패턴에 매핑되는 최소길이의 문자열을 찾음
  • ?이 vim RE에선 lazy quantifier (=greedy quantifier)가 아니기 때문에 curly bracket을 통한 {-min, max}형태를 이용해야함.

다음의 예를 참고:

<a>1</a><a>2</a>
  • 위의 문자열에서 vim RE <a>.{-}</a> 를 사용하면 다음이 매칭 결과임: <a>1</a>
  • Python의 re모듈이라면 <a>.*?</a> 를 사용한다.

앞서 \zs\ze를 같이 사용한 예제:

<h1>\zs.{-}\ze</h1>
  • <h1> 태크 내의 문자열만 매칭 시키는 패턴.

같이 보면 좋은 자료들

2023.07.03 - [Python] - [Python] Regular Expression: 표현식 기초 및 요약

 

[Python] Regular Expression: 표현식 기초 및 요약

Regular Expression : 정규표현식 요약Regular Expression (re) 의 기본적인 operator는 다음과 같음.Basic operatorDescription.Any character except `\n` (newline)aThe character a itselfabThe string ab itselfx|yx or y\yEscapes a special characte

ds31x.tistory.com

2026.02.18 - [utils] - 연습 - Vim Regular Expression

 

연습 - Vim Regular Expression

이 문서는 vim에서의 Regular Expression을 익히기 위한 실습을 다룸: 다음의 문서를 반드시 읽어보고 나서 수행해볼것.2026.02.18 - [utils] - Vim Regular Expression Vim Regular ExpressionVim Regular ExpressionVim에서의 RE(

ds31x.tistory.com

 


 

728x90

'utils' 카테고리의 다른 글

vscode - coding shortcuts  (0) 2026.02.18
연습 - Vim Regular Expression  (0) 2026.02.18
[vim] buffer 와 window  (0) 2026.01.24
johngrib의 vimwiki + github.io 를 설치하기  (0) 2026.01.14
vimwiki/vimwiki (neovim의 init.lua로 설정)  (0) 2026.01.14