vim 정규표현식에서 or(\|) 사용하기


vim의 정규표현식에서 or\| , 역슬래쉬버티컬바로 나타낸다or(\|)은 다음과 같은 형식으로 쓴다


문자열1\|문자열2 문자열1이거나 문자열2와 일치한다.


가령, 탐색하는 문자열이 cat이거나 dog이라면 그 정규표현식은 다음과 같다.


cat\|dog


어떤 문자열 중에 첫 번째 글자가 대문자인지 소문자인지 여부와 상관없이 모두 찾고자 하면 보통 문자 클래스를 이용한다. 가령 Catcat을 동시에 찾고 싶다면 문자 클래스를 이용하여 다음과 같이 작성하면 된다.

 

[Cc]at Cat와 cat를 모두 찾는다.


이와 비슷한 표현을 조금 복잡하지만 or(\|)로 다음과 같이 할 수 있다.


\(C\|c\)at 

→ \( \) 사이에 C\|c 를 배치해서 Cat와 cat를 모두 찾는다.


\(\) 로 인하여 매우 복잡하게 보인다. 그냥 문자 클래스([ ])로 쓰는 것이 편하지 않을까? 앞에 보여준 예에서는 단 한 개의 글자가 대문자이거나 소문자인 것을 선택하는 것이므로 문자 클래스([ ])가 더 쓰기 편하다. 하지만 여러 개의 문자열 중 하나를 선택할 경우에는 or(\|)\(\) 사이에 배치하는 편이 더 쓰기 편하다.

 

가령, 다음과 같은 일련의 파일 이름에서 cat.jpg, anmimal.jpg, dog.jpg 에만 해당하는 정규표현식은 다음과 같다.


cat.jpg

cat.avi

animal.jpg

animal.avi

dog.jpg

dog.avi


\(cat\|animal\|dog\)\.jpg


역슬래쉬점(\.)은 점(.)을 어떤 임의의 한 개의 문자를 의미하는 특수한 용도로 사용하지 말고 점(.) 문자 그 자체로만 인식하라는 의미


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 



문자열의 위치


정규표현식은 문자열을 위치에 따라서 특정할 수 있다. 즉 해당 문자열이 행의 시작에 있는지 끝에 있는지에 따라 구별하여 특정할 수 있고, 단어의 시작인지 끝에 위치한 것인지를 특정할 수 있다. 


캐럿(^)과 달러($)


앞선 문자 클래스 포스팅에서 캐럿(^)이 문자 클래스에서 not의 의미로 쓰이는 것을 언급한 바 있다. 하지만 캐럿(^)이 문자 클래스 외에서 쓰일 때에는 행의 첫 문자를 의미한다. 그리고 달러($)는 정규표현식에서 행의 끝 문자를 의미한다.


캐럿(^)달러($)를 사용할 경우 캐럿(^)은 탐색하고자 하는 문자열의 에 와야 하고 달러($)에 와야 한다


정규표현식 ^cat 행의 맨 앞cat 문자열이 있을 경우 일치

정규표현식 cat$ 행의 맨 뒤cat 문자열이 있을 경우 일치


위에서 작성한 정규표현식으로 탐색한 결과는 다음과 같이 나타난다.



단어의 시작(\<)과 끝(\>)


정규표현식으로 행의 시작과 끝에 있는 문자열을 특정할 수 있듯이 단어의 시작과 끝에 있는 문자열을 특정할 수 있다. 단어의 시작\< 로 나타내고 단어의 끝\> 로 나타낸다.

 

앞서 언급한 캐럿(^)달러($)처럼 단어의 시작(\<)은 찾고자 하는 문자열의 에 와야 하고 단어의 끝(\>)에 와야 한다.

 

정규표현식 \<c.t 단어의 맨 앞ct 형식의 문자열이 있을 경우 일치(○은 임의의 문자 한 개)

정규표현식 c.t\> 단어의 맨 뒤ct 형식의 문자열이 있을 경우 일치(○은 임의의 문자 한 개)


해당 정규표현식으로 탐색한 결과는 다음과 같이 나타난다.



사진을 보면 알겠지만 단어들은 (.), 아포스트로피() 등으로 구분된다.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


030 vim의 정규표현식(4) 문자열의 위치.apkg



문자열


앞서 문자열 탐색의 포스팅에서는 탐색할 문자열을 슬래쉬(/)나 물음표(?) 다음에 바로 입력했다. 이 때 입력한 단순한 문자열도 그 자체로 정규표현식이다. 문자열로 탐색하면 해당 문자열로만 이루어진 것을 찾아주지 않는다. 독립된 단어이든 어떤 단어의 일부이든 그저 탐색할 문자열과 일치하는 모든 것을 전부 탐색한다. 다음은 그 사례다.



점(.) 표현


정규표현식에서 (.)아무 문자나 단 한 개의 문자를 의미한다. 가령, 앞에서 cat를 탐색한 것과 다르게 3글자이고 ct는 기억이 나는데 가운데 한 글자가 기억이 나지 않는 경우가 있다. 이럴 때는 어떻게 검색해야 할까? 명령 라인에 다음처럼 입력하면 된다. 


/c.t


그 결과는 다음과 같다. 




, c임의의 한 글자 그리고 t세 글자로 이루어진 문자열을 전부 찾는다.


, 문자 클래스([ ]) 안에서 (.)표현을 쓸 때는 그냥 (.) 문자 자체를 의미하므로 c[.]tc.t만 해당되고 cat, cut 등은 전부 해당되지 않음

 

(.)으로 탐색할 때 반드시 해당하는 임의의 글자가 1개 있어야 하므로 의 특성을 사용하면 다양한 방식으로 문자열을 탐색할 수 있다


/.cat cat 문자열 앞에 최소 한 글자(공백포함)가 있어야 함. (cat가 행의 가장 앞으로 나오는 경우 제외)

/cat. cat 문자열 뒤에 최소 한 글자(공백포함)가 있어야 함. (cat가 행의 가장 뒤에 붙는 단어 제외)

/c..t c○○t 형태의 문자열

공백점(.)이 나타내는 한 개의 문자에 해당되므로 이 점은 주의를 요함




Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


029 vim의 정규표현식(3) 점(.).apkg


문자 클래스


문자열 관련 탐색을 할 때는 앞서 포스팅한 문자열 탐색에서와 같이 그냥 해당 문자열을 바로 탐색하는 것이 가장 간단하다. , 정방향으로 abc라는 문자열을 문서를 탐색할 때는 다음과 같이 명령 라인에 명령어를 입력하면 된다. 


/abc


그런데 abcAbc로 맨 앞의 a가 대문자이거나 소문자인 경우를 모두 같이 탐색하고 싶으면 어떻게 해야 할까?


다음처럼 검색하면 된다.


/[Aa]bc


여기에서 대괄호([ ])로 묶인 것을 문자 클래스라고 부른다. 문자 클래스는 이 대괄호 사이에 있는 문자 중 하나와 일치하면 해당 문자와 일치하는 것으로 본다. 따라서 해당 위치에 올 수 있는 여러 문자들을 문자 클래스([ ]) 내에 배치하면 다양한 문자열을 아래와 같이 간단하게 찾을 수 있게 된다.


정규표현식과 일치하는 문자열

[ab]c ac, bc

[Aa] Ab, ab

[1234]class  1class, 2class, 3class, 4class


문자 클래스([ ])하이픈(-)을 이용하여 범위를 지정할 수 있다


정규표현식과 일치하는 문자

[a-z] 알파벳 소문자

[A-Z] 알파벳 대문자

[1-9] 1에서 9까지의 숫자

[a-zA-Z0-9] 모든 알파벳과 숫자


또한, 문자 클래스([ ]) 내에 캐럿(^)을 이용하여 not의 의미를 부여할 수도 있다.

 

[^Ff]uck uck 문자열 중에서 F 워드를 제외

[^0-9] 숫자가 아닌 경우


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


정규표현식 개요


정규표현식을 공부하기에 앞서 정규표현식이란 무엇이고 왜 공부하는게 좋은지 조금 동기부여를 해볼 필요가 있다. 


정규표현식이란 무엇일까? 간단하게 정의하면 다음과 같다


정규표현식문자열의 집합을 표현하는 데 사용하는 형식 언어이다.


정규표현식문자열집합이라는 형태로 다루는 형식 언어이기 때문에, 단순히 몇몇 프로그램이나 vim에서 일시적으로 제공하는 도구가 아니다. 


형식 언어로 학문적인 틀을 갖추고 진지하게 연구되어 개발되었기 때문에 그 구현에 있어서 문법과 버전이 조금씩 다를 수는 있어도 그 본질이 크게 달라질 수는 없다. 그리고 대부분의 문법도 편의성 때문에 조금씩 다르게 적용되는 것 말고는 거의 유사한 것으로 알고 있다. 이 이야기는 정규표현식을 익혀놓으면 그것이 소프트웨어 개발이건, 텍스트 편집이건, 운영체제 운용이든 평생 유용하게 써먹을 수 있다는 이야기이다. 물론, 현재에도 정규표현식은 vim 뿐만 아니라 다양한 텍스트 에디터, Unix/Linux 계열의 애플리케이션소프트웨어 개발 등에서 폭넓게 사용되고 그 유용성을 인정받고 있다. 또한, 데이터 유효성 검사, 데이터 웹 스크랩핑, 문법 구현 등에서도 매우 유용하게 쓰이고 있다. 

 

처음 정규표현식을 접하게 되면 각종 기호와 문자가 복잡하게 얽혀있는 모습이 초보자에게 부담스럽게 다가오지만 유용하게 사용할 수준까지는 매우 쉽게 익힐 수 있고 익혀두면 정말 쓸 곳이 많고 유용하다. 다음이 사례를 보면 그 유용성을 느낄 수 있을 것이다. 

 

아래는 자바스크립트에서 전화번호를 입력받아서 그 전화번호가 올바른 형식으로 입력되었는지 확인하는 함수를 구현해본 것이다.


function phone(number) {

  if (number.length > 8 || number.length < 7) {

    return false;

  }

  var numFirst = number.substring(0, 3);

  var numSecond = number.substring(number.length - 4);

  if (isNaN(numFirst) || isNaN(numSecond)) {

    reuturn false;

  }

  if (number.length === 8) {

    return (number.charAt(3) === "-");

  }

  return true;

}


위의 함수는 꽤 간략하게 코드를 정리한 것이다. 하지만 정규표현식을 이용하면 이 코드가 다음과 같이 줄어든다.


function phone(number) {

  return number.match(/^\d{3}-?\d{4}$/);

}


내부 블록에 12줄로 작성된 함수가 마법처럼 1줄로 줄어들었다. 이처럼 정규표현식을 사용하면 문자열 관련 프로그래밍을 하거나 수만 줄의 코드에서 원하는 문구를 정확히 찾아내는 등 문자열 관련한 작업에서 압도적인 효율을 갖출 수 있게 된다.

 

Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


이번 Anki는 "정규표현식문자열의 집합을 표현하는 데 사용하는 형식 언어이다." 라는 구절만 공부합니다. 


027 vim의 정규표현식(1).apkg


기본적인 문자열 탐색 


vim에서 특정한 문자열을 찾는 방법은 표준 모드에서 정방향으로 찾을 경우 슬래쉬(/), 역방향으로 찾을 경우 물음표(?)키를 누른 후 찾기 원하는 문자열을 입력하기만 하면 된다.


명령 라인에 /int  int라는 문자열 전방탐색

명령 라인에 ?int  int라는 문자열 후방탐색


문자열 탐색의 결과는 다음의 사진과 같다.


 

탐색된 문자열에 노란색 하이라이트가 표시된 것은 vim의 옵션에서 hlsearch 옵션이 활성화(on) 되었기 때문이다하이라이트를 없애려면 :set nohlsearch 또는 :set nohl 명령을 입력하여 해당 옵션을 비활성화(off) 하면 된다.

 

그리고 탐색이 이루어진 후 커서를 다음에 일치하는 문자열로 이동하려면 소문자 n키를 누르고 이전에 일치하는 문자열로 이동하려면  대문자 N을 누른다. , 슬래쉬(/)로 정방향 탐색을 할 경우 n키를 누르면 커서는 문서의 정방향에 있는 탐색된 문자열로 이동하고, N키는 문서의 역방향에 있는 탐색된 문자열로 이동한다. 하지만 물음표(?) 역방향 탐색을 할 경우 정반대가 되어 n은 문서의 역방향으로 이동하고 N은 문서의 정방향으로 이동하게 된다.


소문자 n  다음 일치하는 문자열로 커서 이동

대문자 N  이전 일치하는 문자열로 커서 이동


커서 위치 단어 자동 탐색


명령 모드에서 별표(*)를 누르면 커서가 위치한 단어를 자동으로 탐색한다. 이때 별표(*)를 누르는 것은 명령 라인에 /\<(커서가 위치한 문자열)\> 형식으로 입력되면서 정규표현식으로 커서가 위치한 단어를 전방 탐색하라는 명령과 동일하게 된다. 


가령, 커서가 다음 단어의 위치에 있을 때 별표(*)를 누르면

int  /\<int>\>int라는 문자열을 전방 탐색


vim의 문자열 탐색의 강력함은  정규표현식을 같이 사용할 때 그 진가가 드러나게 되므로 다음 포스팅 부터는 vim정규표현식을 공부해보도록 하자.


Anki 파일


아래는 본 포스팅의 내용을 갈무리하기 위한 Anki 파일입니다. 참고하시기 바랍니다. 


026 vim의 문자열 탐색.apkg


+ Recent posts