정리안함/2009년2009. 9. 17. 01:36

 

옵션아이템 '?'

2009 5 1 금요일

오전 10:26

color 또는 colour 찾는 다고 해보자

u 제외하고 전부 같기 때문에

colou?r 라고 하면 둘다 찾을수 있다. 

 

'?' 메타 문자는 옵션을 의미한다. 문자는 표현식에 들어가도 되긴 하지만 반드시

 

어있을 필요는 없는 문자뒤에 위치한다.

 

 

? 메타문자는 다른 메타문자와는 달리 바로앞에 있는 아이템에만 적용됨

 

u? 부분은 언제나 성공적으로 매치된다. ? 핵신은 어떤경우에도 매치된다는

 

july fourth 에서 july,jul 표기 가능하고

 

fourth, 4th, 4 가능하다 하면

 

괄호에 선택 메타 문자를 써도 되겟지만

 

 

july? (fourth|4(th)?) 줄여서 쓸수도 있다.

 

 

여기서 ? 괄호로 감싼 표현식 뒤에도 붙일수 있다.

 

반복 '+' , '*'

2009 5 1 금요일

오전 10:36

물음표와 비슷한 것으로 + (플러스) * (별표) 있다.

 

메타문자 + 바로 앞에 있는 아이템이 하나 이상 반복되는것 의미

 

메타문자 * 바로 앞에 있는 아이템이 0 이상 반복되는것 의미

 

 …* 최대한 여러 반복 시키는에 하나도 없어도 된다.

…+ 최대한 여러 반복해서 매치시키지만 최소한 하나 이상은 있어야 된다.

 

물음표, 플러스 별표 이렇게 세가지는 메타문자가 적용되는 것의 수량에 영향을 끼치

 

때문에 수량자라고 부른다.

 

…? 마찬가지로 …* 부분은 어떤텍스트가 매치되는가 문제가 있지만 항상 매치된다.

 

 

이와 대조적으로 + 부분은 주어진 아이템이 적어도 한번 이상 매치되어야 성공적으로 매치된다.

 

 

예를 들어 ' ?' 라고 하면 스페이스가 개밖에 매칭될수 없지만

 

 ' *' 라고 하면 스페이스의 개수에 제한이 없다.



 

간격 {min,maxx}

2009 5 1 금요일

오전 10:50

egrep에서는 버전에 따라 최소값과 최대값을 제공하는 메타시퀸스 {min,maxx} 지원하는것도 있다. 이런것을 간격 interval 수량자라고 부른다.

 

 

…{3,12} 라고 하면 최소 세번에서 최대 12 까지 나오는 것에 매치된다.

 

 

사이트 아이디가 숫자와 알파벳 소문자 '-', '_' 이용하여 최소 5글자에서 15글자

 

사이라면

 

^[-a-z0-9_]{5,15} 라는 정규 표현식을 쓰면 된다.



 

괄호와 백레퍼런스

2009 5 1 금요일

오전 10:55

지금까지 괄호의 두가지 용도 | 쓸때 선택영역을 제한하기 위한 용도 수량자를 쓸때 여러 개의 문자를 하나의 단위로 묶기 위한 용도

 

egrep에서 많이 안쓰이지만 다른 도구에서 많이 쓰이는 괄호의 사용법에 대해 알아보자

많은 종류의 정규 표현식에서 괄호를 사용하면 그안에 있는 하위 표현식에서 매치된 텍스트를 "기억" 할수 있다. 이장의 시작 부분에서 언급한 중복 단어를 찾는 예와 관련해서 이기능을 사용해 보자. 만약 어떤 단어가 겹쳐 있는지 정확하게 안다면

 

(the 찾는 경우와 같이) the the 같은 식으로 찾으면 되지만

 

\<the the\> 라는 표현식을 쓰면 된다  + 같은 경우는 스페이스가 두개 이상도 찾을수

 

있어 다양한 경우를 검색할수 있다.

 

 

하지만 모든 단어를 이런식으로 검색하는 것은 사실 불가능하다. 만약 아무 단어나 하나

 

매치한 다음 "같은 단어 다시 매치" 같은 식으로 할수 있다면 정말 편하지 않을까?

 

egrep에서 레퍼런스(backreference) 기능을 제공한다면 그렇게 할수 있다.

 

레퍼런스는 표현식에서 전에 매치된 어떤 텍스트와 같은 텍스트를 찾을수 있게 해주는 정규 표현식의 기능이다.

앞에 나온 정규표현식 \<the the\> 기본으로 했을때

 

 

the 임의의 단어에 매칭시킬수있는 표현  [A-Za-z]+ 대체

 

이걸 괄호로 감싸고  그리고 끝에 있는 the \1 이라는 메타 시퀸스로 바꿔보자

 

그러면 \<([A-Za-z]+) +\1\> 이라는 정규 표현식이 완성된다.

 

 

 

또한 정규 표현식에 괄호를 여러 써도 되므로 \1, \2, \3 같은 식으로

 

첫번째 두번째, 세번째 등의 괄호를 참조할수 있다.

 

괄호의 쌍은 왼쪽에서 시작하여 왼쪽 괄로를 기준으로 번호를 매기기 때문에

 

([a-z])([0-9])\1\2  라면 \1 앞에 괄호 \2 두번째 괄호와 매치되는 텍스트를

 

참조한다.


 

이스케이프

2009 5 1 금요일

오전 11:33

메타문자로 해석되는 문자를 매치하는 방법은 다루지 않았는데 이것은 중요하다.

 

인터넷 호스트 주소 같은경우 . 자주 쓰는에 이런경우 이상한 결과를 초래하게 된다.

 

 

 

실제 점을 찾으려면 앞에 백슬래시를 덧붙인 메타시퀸스를 써야 한다.

 

 

ega.att.com 찾고 싶으면 ega\.att\.com 이라고 쓴다.

 

 

\. 이스케이프 처리된 이며 문자클래스를 제외한 모든 위치에서 일반적인 메타문자

 

백슬래시로 이스케이프 처리할수 있다.

 

 

이런 용도로 쓰이는 백슬래시는 "이스케이프(escape)"라고 부른다.

 

메타문자를 이스케이프 처리하면 메타문자의 의미는 없어지고 그냥 원래 문자로 인식된다.



 

심화내용

2009 5 1 금요일

오전 11:42

언어적 다양성

 

지금까지는 egrep 에서 지원하는 정규표현식의 기능을 알아보았지만

 

다른 언어는 좀더 다르기도 하다.

정규 표현식의 목적

 

가장 폭넓게 본다면 정규표현식은 분량이 텍스트 에서 제대로 매치 되는지 여부를

 

판별하기 위한

추가 예제

 

경험은 중요하다.

 

정규표현식을 쓸때 고민해야 부분의 절반 정도는 적절한 상황, 적절한 위치에서

 

매치되도록 만드는

 

 

나머지 절반은 원치않는 위치와 시기에는 매치되지 않도록 하는것

변수이름

 

프로그래밍 언어중에는 숫자로 시작하지 않으면서 알파벳과 숫자 그리고 밑줄로 구성된 이름만을 식별자로 사용할수 있는 것이 많다.

 

이러한 조건에 매치 하려면

 

[a-zA-Z_][a-zA-Z0-9]* 쓰면 된다. 식별자의 길이에 제한이 있다면

 

{min,max} 표기법이 지원되는 경우

 

{0,31}등과 같이 사용한다.

따옴표 안에 있는 문자열에 매치하려면 간단하게 "[^"]*" 사용하면 된다.

달러액수

 

간단하게 \$[0-9]+(\.[0-9][0-9])?

 

달러기호 뒤에 최소한 하나 이상의 숫자가 온다. 그다음 있어도 되고 없어도 되는

 

. 기호 뒤에 숫자 두개

시간 표시

 

부분은  (1[012]|[1-9])12

 

분부분  [0-5][0-9]

 

오전 오후 까지 전부 합치면

 

 

(1[012]|[1-9]):[0-5][0-9] (am|pm)

 

 

된다.


 

정규표현식용어

2009 5 1 금요일

오후 12:06

정규표현식 (regular expression) 이름은 기므로

 

정규식 (regex)라는 준말을 많이 사용함

 

그리고 프로그램에 실제 매치시키는 부분을

 

정규표현식 엔진 (regex engine) 이라고 부른다.

매치

 

어떤 정규표현식이 문자열에 '매치(match)" 된다고 하면 문자열의 하위 문자열에 매치

 

된다는것을 의미한다.

 

 

 

메타문자

 

어떤 문자가 메타문자인지는 정규표현식에서 문자가 있는 정확한 위치에 따라 결정된다.

 

이스케이프 처리중에 \* 이스케이프 처리되었지만

 

\\* 같은 경우는 첫번째 백슬래시에 의해 두번째 백슬래시가 이스케이프 처리되고

 

* 그냥 별표

 

 


 

'정리안함 > 2009년' 카테고리의 다른 글

실습 과제1  (0) 2009.09.17
나에게 경례를 하는 ROTC  (0) 2009.09.17
정규표현식 egrep2  (0) 2009.09.17
정규표현식 egrep  (0) 2009.09.17
1계 상미분 목록들  (0) 2009.09.16
환경설정이 이상하다!!  (0) 2009.09.16
Posted by 멍충한아싸

댓글을 달아 주세요