Perl 에서 쓰는 정규표현식을 이용하면 문자치환을 짜파게티 요리사같이 맘데로 할수가 있다 -ㅁ-/
그동안 노트패드나 한글을 쓰며 Ctrl+F 신공으로 찾아바꾸기로 텍스트를 고쳤다면 ~
이제는 좀더 멋지게 컴터 플밍자 스럽게 찾아바꾸기를 하여보자-ㅅ-ㅋㅋ. 물론 Vi 에디터를 이용해서다!!
*정규 표현식이란?
만약 문서내에 '
첫번째 글자가 영문자고 뒤로 숫자게 3개 있고 줄바꿈이 되어 있는 문자'
를 찾고 싶으면 어떻게 해야할까?
1. 부하직원(후배?)에게 시킨다.
2. 컴터 인공지능을 만들어낸다.
3. 정규표현식을 이용한다.
답은 3번이다-_-ㅋㅋ
정규표현식을 익히면 이런것들을 할 수 있다.
*일단 기본~
gVim 에서 문자 찾기는 비주얼모드에서
'/' 나 '?' 를 누르면 바로 이용할 수 있다.
즉, 문서내에 abcdef 를 찾고 싶으면
/abcdef 엔터
를 누르면 해당되는 문자가 하이라이팅 되며 'n' 을 눌러서 다음 찾기도 볼 수 가 있는 것이다.
그리고 치환은
:[범위]/[매칭문자열]/[치환문자열]/[행범위] 요게 기본
예제를 보세~
명령행모드에서 (비주얼모드에서 ':' 를 누르면 된다)
:s/aaa/ddd/
라고 쓰면 첫번째 나온 행의 첫번째 aaa 만 ddd 로 바뀐다.
더해서~
:s/aaa/ddd/g
라고 쓰면 첫번째 나온 행의 모든 aaa 가 ddd 로 바뀐다.
마지막으로~
:%s/aaa/ddd/g
라고 쓰면 문서전체에서 aaa 가 ddd 로 바뀐다.
즉 s 앞에 쓰는 %문서전체 마지막 g 는 행전체가 되는것이다.
그래서 살짝 응용하면
:-1,+3/s/aaa/ddd/g
라고 쓰면 현재 커서의 앞줄 한칸 뒤로 세칸까지 aaa 가 ddd 로 바뀌는 것이다.
그리고 g 뒤에 'c' 를 살포시 써주면 확인하며 교체도 가능하다.
즉,
:%s/aaa/ddd/gc 하면 되는것이다.
먼가 멋지지 않은가? ㅋㅋ
그럼 가장 처음 말했던 정규표현식이다~
일단 표현하기 위한 기본~!
^ 행의 첫문자 ([] 안에서는 not 의 의미)
. 아무문자나 한문자
[] 괄호 안의 문자 중 하나
* 앞의 내용이 0번 이상 반복됨
\< 단어의 시작
\> 단어의 끝
\n 새 행문자
$ 행의 끝
\| or 의 의미
\{min,max\} min 이상 max 이하 반복됨
\t 탭문자
위만 봐서는 먼소린가 싶다-_-;;
위는 대충 보고 예제 중심으로 보자
1. 소문자로만 쓰인 문자열
[a-z]\+
// 해석
[a-z] 소문자 1글자를 뜻함
\+ 앞의 글자가 하나 이상 반복
2. like0101 이나 korea 1117 을 찾고 싶다.
즉, 영어+ 숫자
[a-z]\+[0-9]\+
3. 숫자로 시작하는 모든 문자열을 찾고 싶다
^[0-9]\+.*
//해석
^ 처음시작이
[0-9] 숫자로
\+ 한자이상 있고
. 어떤문자가(\n 개행문자 제외)
* 0자 이상 있다.
4. 숫자로 끝나는 모든 문자열
.*[0-9]$
//해석 안써도 알것이라 믿는다-_-ㅋ
5. 주민번호 숫자형태를 찾고 싶다.
[0-9]\{6,6\}-[0-9]\{7,7\}
//해석
[0-9] 숫자가
\{6,6\} 최소 6개 최대 6개 반복되며
생략-_-
6. korea Korea 둘다 찾고 싶다
\(K\|k\)orea
//가운데 있는 거 l (엘) 아니고 \요거 쉬프트 누르고 나오는 것임.
끝으로 [0-9] [a-z] [A-Z] 같은 걸 표현할 수 있는 확장표현식을 보고 이시간을 마치겠다ㅋ
\i == [_0-9A-Za-z] 즉 변수지정에 쓸수 있는 문자들 언더바, 숫자,영어대소문자
\I == [_A-Za-z]
\s == 공백문자와 텝
\S == 공백문자 제외한 모든것
\d == [0-9]
\D == [^0-9]
\x == [0-9A-Fa-f] 즉 16진수
\X == 16진수 아닌것
\w == [0-9A-Za-z-]영문단어에서 사용되는것
\W == 영문단어에서 사용되지 않는것
더 있긴한데 별로 쓰지 않는거라 뺀다-ㅅ-;;
자~ 혹시 나의 글을 읽고 자신의 실력을 테스트 해보고 싶은 사람을 위해 과제 하나 내보겠다~
어디 웹페이지 든지 가서 소스를 긁어낸다음에
거기에서 태그들만 쏙다 빼보자.
즉 <> 이 써진 문자만 다빼는것이다-ㅅ-/
참고로 <.*> 이런거 쓰면 아마 남는게 하나도 없는 걸 볼수 있을 것이다. ㅋㅋ 왜그런지도 잠깐 생각해보도록~ㅋㅋ
그럼~/
질문은 리플로 짧게-ㅅ-;