728x90
반응형

보이는 것만이 전부는 아니다.

참 많이 하는 말이다.

우리가 컴퓨터에 입력하는 문서에도 이 말이 적용된다.

다음 세 문장을 보자.

나는 머리가 크다!
우리 형제 3명은 모두 머리가 크다.
그래서 모두 우리를 대두족이라 부르는 걸까?

일단 , ,, 등등 일반 문자가 눈에 띈다. (a, b, c, 나, 형, 제 등 한글자를 문자라고 하고 형제, 머리 등은 문자가 한개 이상 모여 의미단위를 이룰때 단어라고 한다.)

또, 3이라는 숫자도 눈에 띈다.

여기에 ., !, ? 같은 기호도 눈에 띈다.

마지막으로 눈에 띄는게 바로,   공백이다.

그럼 눈에 보이지 않는 건 뭘까?

줄이 세줄로 나뉘어져 있다. 최소한 엔터 두번을 쳐서 저 세문장을 입력했다는 말이다. 사람눈에는 보이지 않지만 줄바꿈 문자라는게 들어가 있다는 말이다.

줄바꿈 문자는 엔터를 한번 칠때마다 들어간다고 생각하면 된다. 줄바꿈 문자는 타자기에서 유래한 개행문자라고도 한다고 언젠가 말했는데, 기억하시면 좋겠다.

영어로는, 아니 컴쟁이들이 newline이라는 말을 잘쓴다. 'new line'이 아니라 그냥 붙여서 newline이라고 한다. 그래서 줄바꿈문자를 newline character라고 하는 거다.

또 두번째 줄에 모두라는 단어와 머리가 사이에 들어간 탭문자도 눈에 보이지 않는다. 탭은 들여쓰기를 할때 쓰는 문자로 사람 눈에 보이지 않는다.

탭문자와 줄바꿈 문자의 차이는 탭문자가 문서내에서 자리를 차지하는데 비해 줄바꿈 문자는 문서내에서 자리를 차지하지 않는다는거다.

문서내에서라고 강조하는 이유는 컴퓨터 내부적으로는 탭문자나 줄바꿈 문자 모두 공간이 필요하기 때문이다. 단지 문서내에서만 줄바꿈 문자는 그냥 줄을 바꾼다는 표시만 할뿐 문자 1개로 인정되지 않는다.

컴퓨터 내부적으로나 문서에서나 전혀 자리를 차지하지 않는 경우도 있는데 줄시작과 끝을 표시만 해주는 경우다. 나는 머리가 크다! 는 첫번째 문장은 사실 [줄시작]나는 머리가 크다![줄끝][줄바꿈문자]식이라는 말이다.

컴퓨터와 정규식으로 의사소통을 하려면 바로 이런 특별한 의미를 갖는 문자일반 문자를 구별해 줄 필요가 있다.

예를 들어 다음 두 정규식의 의미는 전혀 다르다.

찾기 패턴 1: t대두족장


찾기 패턴 2: \t대두족장

첫번째 정규식은 문자 그대로 t라는 알파벳과 대두족장이란 한글이 붙어 있는 패턴을 찾는다.

두번째 정규식은 탭문자대두족장이란 한글이 붙어 있는 패턴을 찾는다.

일반문자앞에 \ 를 붙이면 특별한 의미를 갖기 때문이다. t라는 일반문자에 \를 붙여 \t가 되면 탭문자를 가리킨다.

그래서 \ (backslash)의 이름이 영어로 escape character다. 말그대로 어떤 문자든지 고유의 의미에서 탈출시켜주는(escape) 기능을 한다.

 

한글 자판에서는 원화표시로 나오지만 사실은 / (slash)와 반대방향으로 돼 있는 모습이고 그래서 slash의 반대인 backslash다. 한글 프로그램에서만 원화표시로 나온다.

알파벳 문자 앞에 \ 를 쓰면 요딴 의미가 된다.

\t - 탭문자 (tab)
\n - 줄바꿈문자 (newline)
\r - 새줄시작문자. (carriage return: 윈도우에서는 \r\n 두개를 한 조합으로 개행문자로 쓰고 Linux 등 Unix 기종에서는 \n 하나만 쓴다.)
\d - 숫자 (digit)
\D - 숫자 이외의 문자 (Digit)
\w - 영문알파벳과 숫자를 포함한 일반문자 (한글은 문자취급 안한다)
\W - 영문알파벳과 숫자를 제외한 모든 문자 (한글도 여기 포함된다). 여기서 w는 whitespace의 약자로 서식의 의미를 의미를 갖는 공백, 탭, 줄바꿈문자 등등을 모두 포함한다.


전에도 한번 말했지만 노파심에서 다시... \r 과 \n 은 실제 타자기에서 나온 거라고 했따. \n은 타자기에서 다음줄로 넘어가는 걸 가리키고, \r은 손으로 밀어서 타자 위치를 잡는 걸 말한다. Enter 키를 Return 키라고도 하는 이유다.


예를 들어, 텍스트 문서에 쓸데없이 빈줄이 많이 들어가 있을 경우 다음처럼 해주면 두줄이 연속되는 패턴을 한줄로 줄여준다.

찾기 패턴: \n\n


바꾸기 패턴: \n

주의. UltraEdit을 사용할 경우 이스케이프 문자를 쓰는 형식이 조금 달라진다. 일단 \가 아닌 ^ 문자를 사용해야 하며, 사용하는 알파벳 문자도 조금씩 다르니 주의해야 한다.

^p - \r\n (윈도우 줄바꿈)
^n - \n (유닉스 줄바꿈)
^t - \t (탭문자)

그러니까 위에 나온 빈줄 없애기 패턴은 UltraEdit에서는 이렇게 해야 한다.

찾기 패턴: ^p^p
바꾸기 패턴: ^p

물론, 윈도우 파일의 경우다. 이 글 읽는 분이 유닉스 파일 다룰 일은 없을 걸로 생각한다.

UltraEdit에서 정규식 쓸때는 이것만 기억하면 된다. 다른 건 안먹는다.

알파벳이 아닌 기호들도 정규식에서 특별한 의미를 갖는다. 예를 들어 마침표로 사용하는 . 의 경우를 보자. 이 놈은 이스케이프를 시켜줄 필요가 없다. 자체적으로 특별한 의미를 갖기 때문이다.

찾기 패턴: 대두족장.

이렇게 해주면 대두족장이란 단어에 줄바꿈 문자를 제외한 어떤 문자라도 하나만 붙어 있으면 찾아준다.

패턴 인식: 대두족장은 대두족장이 대두족장을 대두족장' 대두족장? 대두족장a 대두족장1 대두족장

 



하다못해 문자가 아닌 숫자, 기호, 심지어 공백이 붙어 있어도 저 조건을 만족한다. 줄바꿈문자만 아니면 된다. 그러니까 줄 맨마지막에 달랑 대두족장이란 단어만 있다면 제낀다는 거다. 이미지에서도 첫줄 맨 마지막 대두족장만 제껴버렸다.

이게 바로 . 의 위력이다. 줄바꿈 이외의 어떤 문자도 찾아낼 수 있는 와일드카드.

그럼 또 헷갈린다. 진짜 구둣점인 마침표를 찾고 싶을때는 어쩌란 말인가? 컴쟁이들은 공통분모 디따 좋아한다. \ 문자를 escape character로 쓰기로 했으면 효용가치 있는데는 몽땅 이놈을 쓴다는 말이다.

찾기 패턴: \.

이렇게 해주면 와일드카드(.)의 기본 의미를 (.은 줄바꿈 제외한 모든 문자와 일치하는게 기본 의미다) 탈출해서 마침표의 의미를 갖게 된다.

그러니까... \t 의 경우는 t라는 일반문자의 기본 의미를 탈출시켜서 탭문자를 만들어주는 거고, \. 은 와일드카드의 기본 의미를 탈출시켜 우리가 흔히 알고 있는 의 의미를 갖게 해 준다는 말이다.

말줄임표를 찾는다면 어떨까?

 

잘못된 찾기 패턴: ...

 

이딴식으로 찾으면 안된다. 정규식에서 . 는 의미가 다르니까 탈출시켜줘야 한다.

 

올바른 찾기 패턴: \.\.\.

 

이스케이프는 나올때마다 해줘야 한다. 컴퓨터한테 융통성을 바라지 말라. 와일드카드 나온김에 와일드카드에 해당하는 정규식 기호들을 정리하고 넘어가자.

. - 앞에 나왔듯이 줄바꿈 문자 이외의 어떤 문자와도 일치한다. a. 라고 하면 a로 시작해서 어떤 문자든 문자 하나가 따라오면 조건을 만족한다는 말이다.

* - 구글의 컴쟁이 근성을 얘기할때도 나왔고 와일드카드하면 대명사처럼 돼버린 별표다. 이 놈은 앞에 나온 문자0번 이상 반복되는 경우를 말한다.

요말 좀 어려우니 풀어보자.

앞에 나온 문자란 예를 들어 a* 라고 하면 a가 앞에 나온 문자다. 0번이상 반복이란 말을 한걸로 봐서 당연히 0을 포함한다. 그러니까... 우습게도 앞에나온 문자가 한번도 나오지 않는 경우까지 포함해서 무한 반복되는 경우까지 찾으라는 말이다.

그래서 이딴 거 다 찾는다.

찾기 패턴: w*\.대두족장\.com

패턴 인식: .대두족장.com w.대두족장.com ww.대두족장.com www.대두족장.com wwww.대두족장.com

.대두족장.com을 찾는 이유는 w 라는 문자가 0번 반복되기 때문이다. 다시, 헷갈리지 마시고... 0번 이상 반복의 의미가 바로 이거다. 패턴에서 별표 앞에 있는 문자가 안나와도 상관없다는 말이다. 그리고, 무한반복이 가능해서 wwwwwwwwwwwwwwwwwwwww.대두족장.com 이딴것도 찾는다. .대두족장 앞에서 w가 몇번 반복돼도 상관없다.

비슷한 반복의 의미를 갖는 정규식 기호가 있는데 바로 + 다.

+ - 앞에 나온 문자가 최소한 1번 이상 반복되는 경우를 말한다.

그러니까 *처럼 0번은 안된다. 최소한 1번은 나와줘야 한다.

찾기 패턴: w+\.대두족장\.com

패턴 인식: w.대두족장.com ww.대두족장.com www.대두족장.com wwww.대두족장.com

 



*가 들어간 찾기 패턴에서 .대두족장.com라는 검색결과는 제낀다. .대두족장 앞에 w가 한번도 들어가지 않으니까.

헷갈려도 참으시라. 앞으로 연습하면서 계속 설명하겠다.

 

딱 한번만 나오거나 말거나를 지정할 수도 있다. 바로 ? 기호다.

 

? - 앞에 나온 문자가 0번 또는 1번 반복되는 걸 허용.

 

그러니까 최 ?완규 라고 하면 최완규처럼 쓴 것도 괜찮고 최 완규처럼 쓴 것도 괜찮다는 말이다. ? 기호 앞에 공백이 있으니 공백이 없거나 또는 딱 한개만 허용하라는 정규식 패턴이기 때문이다.

 

 

파일 이름에 들어가는 와일드카드 ?, * 를 자주 쓰는 사람은 헷갈릴 수 있다. 파일이름에서는 * 의 경우 복수의 어떤 문자가 들어가도 상관없다는 뜻이고, ? 는 딱 한개의 글자만 허용하는 거다. 하지만 정규식에서는 * 와 ? 가 옵션을 뜻한다. * 는 0번 이상 반복, ? 는 0번 또는 딱 1번만 반복이다. 헷가릴지 마시라.

? 기호는 한끝 차이로 의미가 달라지는 놈들을 찾는 데 유용하다. 예를 들어, 영어식 칼라 표기인 color와 영국식 칼라표기인 colour 를 모두 찾으려면 colou?r 라고 해주면 된다는 거다. 철자법이 미국식인지 영국식인지 달랑 알페밧 u 의 유무에 따라 달라지는 거니까 그걸 옵션 처리하겠다는 뜻이다. 그럼 colorcolour 든 모두 찾아준다.


줄의 시작과 끝에 해당하는 정규식 기호 살펴보고 오늘 마무리 하자. 줄의시작 표시문자라는 것 역시 눈에 보이거나 키보드로 쳐넣을 수 있는게 아니라고 했다.

^ - 줄의 시작과 일치.

$ - 줄의 끝과 일치.


뭔소리냐면...

찾기 패턴: ^대두족장

패턴 인식: 대두족장은 대두족장 놀이터라는 블로그를 운영한다.

 



줄을 시작하는 부분에 나오는 첫번째 대두족장은 찾아도 두번째 대두족장은 줄 시작이 아닌 중간에 있기 때문에 찾지 않는다. 그럼 줄끝에 나오는 대두족장을 찾으려면?

찾기 패턴: 대두족장$

요러면 된다. 다시 짱구를 굴려서 한줄에 달랑 대두족장이라는 단어만 있는 패턴만 찾으려면?

찾기 패턴: ^대두족장$

 



요딴 말이다. 줄시작과 동시에 대두족장이라는 말이 나오고 곧바로 줄이 끝나버리는 패턴만 찾으라는 거다. 하다못해 공백이 하나 들어가도 찾지 않는다. 공백도 엄연한 문자라고 했다.

더하면 머리 터질테니 오늘은 요까지만 하자.

시껍하는 분 계실까봐...

 

 

오늘 나온거 다 외우라는 거 아니다. 헷갈리면 찾아보면 된다. 영어에서 모르는 단어 나오면 사전 찾듯이...

사실 정규식 기호 몇개 안된다. 규칙도 간단하고... 단지, 사람이 언뜻 이해하기 어렵다는 것 뿐이다. 한번 쭉 훑어서 감을 잡은다음 연습을 통해 몸에 익히는 거고 까먹었으면 다시 기호의 의미 찾아보면 된다.

컴쟁이들도 다들 그렇게 한다. 걱정마시라.

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,