vim의 문자열 바꾸기 기본 형식

 

vim에서 문자열 바꾸기를 할 때에는 기본적으로 다음과 같은 형식으로 명령 라인에 명령어를 입력한다

 

:[범위]s/[바꿀 문자열]/[바뀐 문자열]/[바꾸기 옵션]

 

 

위의 명령은 "문서의 이 [범위]에서 [바꾸기 옵션]에 따라 [바꿀 문자열][바뀐 문자열]로 바꾼다."라고 해석한다.

 

[범위] [바꾸기 옵션]

 

우선 [범위][바꾸기 옵션]에 대해서 알아보자.

 

[범위]는 앞서 포스팅한 명령 라인에서 범위지정하기를 그대로 사용하면 된다. 단지, [범위]를 생략할 경우 현재 커서가 위치한 행에서만 문자열 바꾸기가 일어난다는 점이 다르다.

 

 

그리고 [바꾸기 옵션]은 다음과 같다.

 

 

[바꾸기 옵션] 생략 [범위] 내의 각 행에서 처음 일치하는 문자열만 바꿈

g [범위] 내에 행에서 모든 문자열을 바꿈

i 대소문자를 무시하고 바꿈

c 문자열을 바꿀 때마다 바꿀지 여부를 확인

  (y/n/a/q/l/^E/^Y)

  y : 현재 문자열을 바꾸고 다음 바꿀 문자열로 넘어감

  n : 현재 문자열을 바꾸지 않고 다음 바꿀 문자열로 넘어감

  a : 모든 문자열을 바꾸고 종료

  q : 더 이상 바꾸지 말고 모두 종료

  l : 현재 행만 바꾸고 종료

  ^E : [Ctrl+E], 아래로 한 행 화면 스크롤

  ^Y : [Ctrl+Y], 위로 한 행 화면 스크롤

 

일단, 아래의 사례를 참조하자. 아래의 vim 텍스트 맨 앞의 번호들은 행번호이다. :set nu로 행번호를 노출시킨 상태이다. 커서는 1행의 첫 번째 one 바로 옆에 위치해 있다. 이 상황에서 명령어를 입력한다.

 

1 one one One ONE

2 one one One ONE

one one One ONE

one one One ONE

 

우선문자열 one을 two로 바꾸려고 한다따라서 [바꿀 문자열]은 one이고 [바뀐 문자열]은 two가 된다.

 

:s/one/two 현재 커서가 위치한 행에서 one을 찾아 처음 일치하는 문자열two로 바꿈

 

two one One ONE

2 one one One ONE

3 one one One ONE

4 one one One ONE

 

[범위]가 생략되어 커서가 위치해 있던 1행에서만 문자열을 탐색했고 [바꾸기 옵션]이 생략되어 처음 일치하는 one만 two로 바뀜

 

:%s/one/two 문서 전체에서 one과 일치하는 문자열을 찾아 각 행에서 처음 일치하는 문자열two로 바꿈

 

1 two one One ONE

2 two one One ONE

3 two one One ONE

two one One ONE

 

[바꾸기 옵션]이 생략되어 각 행에서 처음 일치하는 one만 two로 바뀜

 

:%s/one/two/g 문서 전체에서 one과 일치하는 문자열 모두two로 바꿈

 

1 two two One ONE

2 two two One ONE

3 two two One ONE

two two One ONE

 

[바꾸기 옵션]이 g이므로 각 행에서 든 일치하는 one 문자열이 two 문자열로 바뀜

 

:%s/one/two/gi 문서 전체에서 대소문자와 상관없이 one과 일치하는 문자열 모두two로 바꿈

 

1 two two two two

2 two two two two

3 two two two two

two two two two

 

[바꾸기 옵션]은 사용하려는 옵션을 붙여서 동시에 옵션을 적용할 수 있어 gi 옵션으로 대소문자 상관없이 모든 행에서 전부 바뀌게 됨

 

:2,3s/one/two/g 2, 3번 행에서 one과 일치하는 문자열 모두two로 바꿈

:+1,+2s/one/two/g 커서가 1행에 있으므로 2(+1), 3(+2)번 행에서 one과 일치하는 문자열 모두 two로 바꿈

 

1 one one One ONE

2 two two One ONE

3 two two One ONE

4 one one One ONE

 

위의 두 가지 명령 모두 2번행과 3번행에 적용됨

 

Anki 파일

 

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

 

 

 

 

043 vim 문자열 바꾸기 기본 형식 및 범위와 옵션.apkg
다운로드

 

vim  확장 정규 표현식 4


\i 변수 지정에 사용되는 문자 [_0-9A-Za-z]


/\i 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\I \i 와 같지만 숫자는 제외


/\I 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\p 프린트 가능한 문자

 

/\p 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\P \p와 같지만 숫자는 제외


/\P 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\k  키워드로 사용하는 문자


/\k 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\K \k와 같지만 숫자는 제외


/\K 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\f 파일명으로 사용하는 문자


/\f 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\F \f와 같지만 숫자는 제외


/\F 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


Anki 파일


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


041 vim의 정규표현식(14) 확장 정규 표현식 4.apkg

vim  확장 정규 표현식 3

\h 영문 단어의 시작에 사용되는 문자 [A-Za-z_]

/\h 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\H 영문 단어의 시작에 사용되지 않는 문자 [^A-Za-z_]

/\H 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\a 모든 알파벳 [A-Za-z]

/\a 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\A 알파벳이 아닌 문자 [^A-Za-z]

/\A 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\l → 알파벳 소문자 [a-z]

/\l 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\L  알파벳 소문자가 아닌 문자 [^a-z]

/\L 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\u  알파벳 대문자 [A-Z]

/\u 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\U 대문자가 아닌 문자 [^A-Z]

/\U 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


Anki 파일


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


040 vim의 정규표현식(13) 확장 정규 표현식 3.apkg


vim  확장 정규 표현식 2


\x 16진수 문자 [0-9A-Fa-f]

/\x 로 검색하면 그 결과는 다음과 같다.

 

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\X 16진수 숫자가 아닌 문자 [^0-9A-Fa-f]

/\X 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\o 8진수 숫자 [0-7]

/\o 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\O 8진수 숫자가 아닌 문자 [^0-7]

/\O 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\w 영문 단어에 사용되는 문자 [0-9A-Za-z_]

/\w 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하


\W 영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z_]

/\W 로 검색하면 그 결과는 다음과 같다.


ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789    ! " # $ % & '

( ) * + , - . / : ; < = > ?

@ [ \ ] ^ _ ` { | } ~

가나다라마바사아자차카타파하



Anki 파일


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



아스키(ASCII) 코드 POSIX 문자 클래스

                                                   

바로, 앞의 포스팅에서 문자 클래스에 16진수 코드값을 넣어 아스키(ASCII) 코드의 해당 문자를 나타낼 수 있음을 언급했고 동시에 POSIX 문자 클래스를 이용하면 16진수 코드값 없이 이를 쓸 수 있다고 했다. 이를 확인해 보자.

                                                   

아스키(ASCII) 코드POSIX 문자 클래스의 관계를 요약하면 다음 표와 같다.

                                                   

 10진수

16진수 

 문자 종류

POSIX 문자 클래스

 0~31

 0x00~0x1F

 제어문자

[:ascii:], [:cntrl:]

 32

0x20

공백(Space)

[:ascii:], [:print:], [:space:], [:blank:]

 33~47

 0x21~0x2F

구문기호 및 심볼

[:ascii:], [:graph:], [:print:][:punct:]

 48~57

 0x30~0x39

숫자(0~9)

[:ascii:], [:graph:][:print:], [:alnum:], [:digit:]

 58~64

 0x3A~0x40

구문기호 및 심볼

[:ascii:], [:graph:][:print:][:punct:]

 65~90

 0x41~0x5A

대문자( A~Z)

[:ascii:], [:graph:][:print:], [:alnum:], [:alpha:], [:upper:]

 91~96

 0x5B~0x60

구문기호 및 심볼

[:ascii:], [:graph:][:print:][:punct:]

 97~122

 0x61~0x7A

소문자( a~z)

[:ascii:], [:graph:][:print:], [:alnum:], [:alpha:], [:lower:]

 123~126

 0x7B~0x7E

구문기호 및 심볼

[:ascii:], [:graph:][:print:], [:punct:]

 127

 0x7F

제어문자

[:ascii:], [:cntrl:]

                                                   

이 중 앞 서 다루지 않았던 [:ascii:], [:cntrl:], [:graph:], [:print:], [:punct:]5개의 POSIX 문자 클래스에 대해서 자세히 알아보자.


아스키(ASCII) 문자 전체

                                                   

아스키(ASCII) 코드에 해당하는 문자 전체POSIX 문자 클래스로 나타낼 수 있다. 16진수0x00에서 0x7F까지 128개의 아스키 문자를 다음과 같이 나타낸다

                                                   

[:ascii:] 아스키(ASCII) 코드에 해당하는 문자 전체, [\x00-\x7F]


제어 문자(Control characters)

                                                   

아스키 문자 중에서 0x00~0x1F(0번부터 31번까지)0x7F(127)아스키 문자제어 문자(Control characters)라고 부르고 다음처럼  POSIX 문자 클래스로 나타낼 수 있다.

                                                   

[:cntrl:] 제어 문자, [\x00-\x1F\x7F]


그 외 볼 수 있는(Visible) 문자

                                                   

아스키 문자 중에서 제어 문자를 제외한 문자들은 알파벳 대소문자와 숫자 구문기호(?, ! ), 공백으로 실제 화면에 나타나는 문자들이다이러한 문자들은 [:graph:], [:print:], [:punct:]의 3종류로 나눈다. 

                                                   

[:graph:]는 아스키(ASCII) 코드[\x21-\x7E]에 해당하는 문자로 제어 문자와 공백 문자를 제외한 눈으로 볼 수 있는 문자들이다.

                                                   

[:graph:]  보이는 문자, [\x21-\x7E]제어 문자와 공백 문자 외의 문자

 

[:print:]는 아스키(ASCII) 코드[\x20-\x7E]에 해당하는 문자로 [:graph:]에 공백을 더한 문자들이다.

                                                   

[:print:]  보이는 문자와 공백, [\x20-\x7E]제어 문자 외의 문자


[:punct:]는 아스키(ASCII) 코드에서 구문기호 및 심볼문자 클래스 [!"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]에 해당하는 문자들이다. 

                                                   

[:punct:] 구문기호 및 심볼


Anki 파일


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



아스키(ASCII) 코드와 문자 클래스


앞서 배운 정규표현식의 문자 클래스([ ])에서 우리는 문자 클래스([ ])에 개별 문자들을 하나하나 기입하지 않고 다음의 경우처럼 범위로 제시할 수 있었다


[A-Z], [a-z], [0-9], [A-Za-z], [A-Za-z0-9]


그러면서 이런 생각을 해봤을 가능성이 있다. 구태여 [A-Za-z]라고 하지 않고 [A-z]라고 하면 대문자 A부터 소문자 z까지 모든 알파벳 대소문자를 다 대표할 수 있지 않을까?

 

알파벳 대소문자를 의미하는 문자 클래스를 구태여 [A-Za-z]라고 [A-z]하지 않는 이유를 알려면 아스키(ASCII) 코드를 보아야 한다. 


우리가 사용하는 정규표현식의 문자 클래스아스키(ASCII) 코드를 이용하고 있다. 아스키(ASCII) 코드의 간단한 구성은 다음의 표와 같다.


 10진수

16진수 

 문자

비고 

 0~31

 0x00~0x1F

 NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SOH, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FS, GS, RS, US

 제어문자

 32

 0x20

 Space

 공백

 33~47

 0x21~0x2F

 ! " # $ % & ' ( ) * + , - . / 

 구문기호 및 심볼

 48~57

 0x30~0x39

 0~9

 숫자

 58~64

 0x3A~0x40

 : ; < = > ? @

 구문기호 및 심볼

 65~90

 0x41~0x5A

 A~Z

 알파벳 대문자

 91~96

 0x5B~0x60

 [ \ ] ^ _ `

 구문기호 및 심볼

 97~122

 0x61~0x7A

 a~z

 알파벳 소문자

 123~126

 0x7B~0x7E

 { | } ~

 구문기호 및 심볼

 127

 0x7F

 DEL

 제어문자


아스키(ASCII) 코드에는 0에서 127까지 총 128개의 문자가 있고 이 중 65~90번 까지A~Z의 알파벳 대문자이고, 중간에 구문기호 및 심볼91~96까지 들어가 있으며 그 뒤에 다시 97~122까지 a~z로 알파벳 소문자가 나온다. 만일, 문자 클래스[A-z]라고 하면 실은 아스키(ASCII) 코드 65~122까지 아우르는 것이므로 원치 않는 구문기호와 심볼까지 포함하는 문자 클래스가 되기 때문에 [A-z]라고 쓰지 않는 것이다.

 

정규표현식의 문자 클래스([ ])가 아스키(ASCII) 코드를 인식하므로 해당 문자의 16진수 코드값을 대괄호 안에 넣어서 문자 클래스를 만들 수 있다. , 원하는 문자를 문자 클래스로 묶을 때, 이제까지는 대괄호[ ] 안에 원하는 문자를 입력하여 문자 클래스로 묶었지만 해당 문자의 16진수 아스키(ASCII) 코드값을 알고 있다면 문자 대신 코드값을 넣어 해당 문자를 대괄호 안에 넣어서 문자 클래스를 만들 수 있다.

 

가령, 대문자 A아스키(ASCII) 코드에서 65번이고 16진수로는 0x41이다. 이를 문자 클래스에 16진수로 표기할 때는 x 앞에 숫자 0을 제거하고 역슬래쉬(\)를 붙여 x가 문자가 아닌 16진수를 나타내기 위한 기호라는 것을 나타내면서 다음과 같이 작성한다


[\x41] = [A]

 

그 외에 몇 가지 사례는 다음과 같다


[\x00] = NUL(제어문자)

[\x61-\x7A] = [a-z]

 

키보드를 눌러서 나타낼 수 있는 문자들은 아스키(ASCII) 코드를 일일이 알고 쓸 필요는 없지만 제어문자는 키를 눌러서 표시하기 어려우므로 정규표현식으로 이에 접근하려면 해당 제어문자의 16진수 코드값을 알아야 해서 매우 번거롭다.

 

이런 불편함을 해소하기 위해 POSIX 문자 클래스는 필요한 문자열 집합들을 제시하고 있으므로 이를 응용하면 조금 더 수월하게 정규표현식을 나타낼 수 있게 된다.

 


Anki 파일


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






POSIX 문자 클래스


vim은 정규표현식 내에 POSIX 문자 클래스를 지원하는데, 이런 POSIX 문자 클래스를 이용하면 정규 표현식으로 사용하기 힘든 제어 문자들을 쉽게 사용할 수 있어 유용하다


다음은 우리가 앞서 배웠던 것과 유사한 것들로 쉽게 이해할 수 있는 POSIX 문자 클래스이다. 쉬운 것부터 보자.


[:alnum:] Alphanumeric characters알파벳 대소문자와 숫자, [A-Za-z0-9]

[:word:] Word characters알파벳 대소문자와 숫자와 언더바(_), [A-Za-z0-9_]

[:alpha:] Alphabetic character알파벳 대소문자, [A-Za-z]

[:lower:] Lowercase letters알파벳 소문자, [a-z]

[:upper:] Uppercase letters알파벳 대문자, [A-Z]

[:digit:] Digits10진 숫자, [0-9]

[:xdigit:] 16진수, [A-Fa-f0-9]


다음은 공백을 나타내는 것들이다. 


[:blank:] 탭과 공백문자, [ \t]

[:space:] 모든 화이트 스페이스 [ \t\r\n\v\f]

공백( ), (\t), 캐리지 리턴(\r), 개행 문자(\n), 수직탭(\v), 폼 피드(\f)


POSIX 문자 클래스를 사용할 경우 앞서 배운 문자 클래스([ ])로 감싸야 한다. , 대괄호가 두 번 중복 사용된다. 가령 다음과 같다.


[[:digit:]]\+ [0-9]\+ 


지금까지는 앞서 배운 정규표현식으로 간단히 나타낼 수 있는 것들을 POSIX 문자 클래스로 어떻게 나타내는지 살펴보았다. 다음에는 정규 표현식으로 사용하기 힘든 제어 문자들을 나타내는 POSIX 문자 클래스를 살펴본다.

 


Anki 파일


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


035 vim의 정규표현식(8) POSIX 문자 클래스 1.apkg


정규표현식 연습 사례


 이제까지 배웠던 vim 정규표현식 패턴을 응용해 보자.


[a-z]\+ 소문자로만 이루어진 문자열

ex) "worldcup", "john"


[a-z]\+[0-9]\+ 앞에는 소문자 문자열이 오고 뒤에는 숫자가 오는 문자열

ex) "worldcup2002", "john27"


[a-z]\+[0-9]* 앞에는 소문자 문자열이 오고 뒤에는 숫자가 오거나 소문자만 있는 문자열

ex) "john", "john1", "john27", "john2005"


Hello\ [a-z]\+[0-9]* → Hello 한칸 건너고 알파벳 소문자 문자열이 오고 뒤에는 아무것도 없거나 숫자가 오는 문자열

ex) "Hello john", "Hello john1", "Hello john27", "Hello john2005"


 ※ 역슬래쉬스페이스바(\ )는 문자 그대로 한 칸의 공백을 의미함. 공백 문자가 명령어나 인자들을 구분하는 의미로 사용되는 메타 문자이기 때문에 공백 앞에 역슬래쉬(\)를 붙여주어야 정상적인 공백으로 인식한다


^[0-9]\+.* 행의 시작에서 숫자로 시작하는 문자열

^[^0-9]\+.* 행의 시작에서 숫자로 시작하지 않는 문자열


.*[0-9]$ 행의 끝에서 숫자로 끝나는 문자열

.*[^0-9]$ 행의 끝에서 숫자로 끝나지 않는 문자열


[a-z]\+[0-9]\{4,7\} 알파벳 소문자 문자열 뒤에 숫자로 구성된 문자가 연속으로 4~7번 반복되는 문자열

 

 C에서 변수를 선언할 때 int var; 같은 문자열에 해당하는 패턴은?


int\(\ \|\t\|\n\)\+var; \(\ \|\t\|\n\)\+ 부분은 모든 화이트스페이스(공백, , 개행)의 연속을 의미함

 

Anki 파일


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


034 vim의 정규표현식(7) 몇 가지 예제들.apkg

정규표현식 반복하기


주민등록번호를 정규표현식으로 나타내려면 어떻게 해야 할까? 


주민등록번호는 엄밀하게 말하면 모든 자리의 수가 0에서 9까지의 숫자로 이루어진 것은 아니지만 편의상 ○○○○○○-○○○○○○○ 형식의 앞에 6개의 숫자하이픈(-) 뒤에 7개의 숫자로 이루어진 일련의 문자열로만 다룬다고 할 때 정규표현식은 어떻게 될까?


앞서 우리는 [0-9]라는 문자 클래스를 이용하여 숫자들에 해당하는 하나의 문자를 지정하는 법을 배웠다.


그렇다면 정규표현식은 다음과 같을 것이다.


[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]


너무 길다. 이렇게 반복되는 경우를 효율적으로 처리할 방법이 필요하다.


정규표현식에서는 특정한 표현식을 반복하는 방법을 아래와 같이 제공하고 있다.


\{min,max\} → 앞의 내용이 min 이상 max 이하 반복됨

* 앞의 내용이 0 이상 반복됨

\+ 앞의 내용이 1 이상 반복됨


\{min,max\}를 이용하여 주민등록번호를 지정하면 다음과 같다


[0-9]\{6,6\}-[0-9]\{7,7\}

\{6,6\}은 최소 6번 최대 6번 이므로 그냥 6번 반복한다는 뜻이다.

\{7,7\}은 최소 7번 최대 7번 이므로 그냥 7번 반복한다는 뜻이다.


\{min,max\}에서 min0으로 할 경우 반복이 전혀 없는 경우도 해당된다.


[0-9]\{0,max\} 숫자가 0번 이상 max 이하 반복되므로 숫자가 전혀 없는 경우도 해당됨


\{min,max\}에서 max를 생략할 경우 반복 횟수에 제한이 없어진다. 따라서

 

*  \{0,\}과 동일하다.

\+ → \{1,\}과 동일하다.


Anki 파일


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


033 vim의 정규표현식(7) 반복.apkg



역슬래쉬(\)를 붙이는 문자들


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


문자열의 집합을 효과적으로 표시하려다 보니 다양한 문자들을 문자 외의 다른 용도로 사용하기 위하여 역슬래쉬(\)를 붙이거나 문자 외의 다른 용도로 특수하게 사용되는 문자들을 문자 그 자체로 나타내기 위해서 역슬래쉬(\)를 붙이기도 한다. 


특정 용도의 문자를 문자 그 자체로 나타내기 위하여 역슬래쉬(\)를 붙이는 경우


\. 임의의 한개의 문자가 아닌 문자로써 (.)을 나타냄

\\ 문자 역슬래쉬(\)를 나타냄

\[ 문자 왼쪽 대괄호([)를 나타냄

\] 문자 오른쪽 대괄호(])를 나타냄


특정 문자를 탭(tab), Esc 등 문자 외의 다른 용도로 사용하기 위하여 역슬래쉬(\)를 붙이는 경우


\e esc

\t tab

\r 캐리지 리턴

\b 백스페이스

\n 개행 문자



Anki 파일


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


032 vim의 정규표현식(6) 특수 문자.apkg


+ Recent posts