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

 

정규표현식 소개

2009 4 30 목요일

오후 2:35

정규표현식을 사용하면 텍스트 관련 문제에 있어 간단하게 해결된다.

막강한 패턴언어 패턴 자체를 정규 표현식( regular expression) 이라 부른다.

정규표현식은 두가지 유형의 문자로 이루어진다.

 

특수문자 (파일이름을 검색할때 사용하는 * 문자 같은것) 메타문자(metacharacters)라고 부른다.

 

 

나머지는 리터럴(literal)문자 또는 일반텍스트 문자 (normal text character)라고 부른다.

 

메타문자 시작- ^ $

2009 4 30 목요일

오후 3:07

행의 시작과   ^ (캐럿)문자 $ (달러)문자 메타문자가운데 가장 이해하기 쉬움

 

^cat -> 행이 시작하는 위치에 있는 c, a, t 에만 매치된다.

 

cat$ _> 한줄의 맨끝에 있는 scat 같이 행이 끝나는 위치에 있는 c, a,t 찾아냄

 

^ -> 시작   $ ->

 

여러문자 가운데 한문자 매치하기


 

문자클래스 […]

2009 4 30 목요일

오후 4:20

여러문자 가운데 한문자 매치하기

"grey" 라는 단어를 검색하고 싶을때 "gray" 라는 철자도 사용한것도 찾아내야 한다면

 

보통 문자 클래스 (character class)  라고 부르는 정규표현식 구조

 

[…] 사용하면 매치를 할때 허용한 문자를 모두 지정할수 있다.

 

 

그래서 gr[ea]y g 뒤에r r뒤에 e 또는 a 그뒤에는 y 붙는다. 라고 해석

 

grey 또는 gray

문자클래스 안에 들어가야할 문자의 개수에는 제한이 없음 예를 들어 [123456]

 

1,2,3,4,5,6, 모든 숫자에 매치된다. 이런 클래스는

 

<H1>,<H2>,<H3> 같은 문자열에 매치되는 <H[123]> 같은 정규표현식에 쓸수 있음


 

(대시) '-'

2009 4 30 목요일

오후 4:24

문자 클래스 안에서 문자클래스 메타문자인 '-' (대시) 문자의 영역을 나타낸다.

<H[1-6]>  == <H[123456]>

 

[0-9] 숫자들  [a-z] 소문자들 혼합해서 사용가능

 

[01234567abcdefgABCDEFG] == [0-7a-gA-G]

 

이러한 정규 표현식은 16진수를 처리할때 유용하게 사용한다.

 

영역과 리터럴 문자를 혼합해서 써도 된다.

대시는 문자 클래스 안에서만 메타문자로 인식된다는 점에 주의

 

문자클래스 (character class) 밖에서는 그냥 '-' 라는 문자로 인식되며

 

문자클래스에서도 대시문자가 클래스의 첫번째 글자이면 영역을 나타낼수 없으므로 메타

 

문자로 간주되지 않는다. 클래스 뒤에 물음표나 점이 있으면 보퉁 정규 표현식 메타 문자로

 

간주된다 하지만 클래스에 들어있지 않은 경우에만 메타문자가 된다. 따라서 [0-9A-Z_!.?] 에서 메타문자는 두개의 대시 뿐이다.

 

문자 클래스는 자체를 별도의 작은 언어라고 볼수 있다. 메타 문자의 종류와 역할은

 

문자 클래스 안과 밖에서 완전히 달라진다.



 

부정문자클래스 [^]

2009 4 30 목요일

오후 4:25

부정형 문자 클래스

[…] 아니라 [^] 사용하면 주어진 문자를 제외한 모든 문자에 매치된다.

 

예를 들어 [^1-6] 이라고 하면 1 이상 6이하의 숫자를 제외한 모든 문자에 매치된다.

 

 


 

() '.'

2009 4 30 목요일

오후 4:26

점을 사용하여 임의의 문자에 매치시키는

'.' 메타문자 () 임의의 문자에 매치되는 문자 클래스를 줄여 쓴것

 

표현식에서 " 이자리는 아무 문자나 들어가도 된다" 것을 표시할때 유용

 

예를 들어 03/16/19 , 03-16-19, 03.16.19 따위를 겁색하고 싶을때

 

03[-./]16[-./]19  해도 되지만 간단하게 03.16.19 해도 문제는 없다. (예기치 않은 문제가 발생할수도 있다.

 

 

여기서 '.' 문자클래스 안에 있으면 메타문자로 간주되지 않으며 바깥에 있어야

 

메타문자로 간주된다.



 

("또는") '|'

2009 4 30 목요일

오후 4:27

여러 하위 표현식 하나를 찾는 방법

 

 

"또는" <- 이것을 의미하는 정말 편리한 메타문자로 '|' 있다.

 

메타 문자를 이용하면 여러 개의 표현식을 하나로 묶어서 그중 하나의 표현식에 매치되도록 할수 있다.

 

예를 들어 bob robert 서로 별개의 표현이지만

 

bob|robert 라고 하면 둘중 아무 문자열에나 매치되는 하나의 표현식이 된다.

 

 

 

앞에 나왔던 gr[ea]y grey|gray 또는 gr(a|e)y 두번째 표현식에서는 역시 메타문자

 

괄호를 사용하여 둘중 하나를 선택할 범위를 제한한다.

 

하지만 gr[a|e]y 다른것이다. 여기서 '|' 보통 문자로 처리된다.

 

 

 

gr(a|e)y 라고 할때에는 반드시 괄호를 써야 한다. 괄호를 사용하지 않고 gra|ey 라고 하면 gra 또는 ey 처리된다. 괄호로 감싸 놓으면 괄호안에 있는 부분만 선택한다.

 

 

다른 예로 (First|1st) [Ss]treet 생각해 보자

 

사실 Fist 1st 모두 st 끝나기 때문에  (Fir|1)st [Ss]treet 라고 써도 된다.

 

선택과 문자 클래스의 개념을 혼동하지 말자

 

문자 클래스는 대상 텍스트 중에서 개의 문자에만 매치시킬수 있다.

 

 

하지만 선택을 사용하면 선택 사항 자체가 모든 기능을 갖춘 정규표현식이 될수 있기 때문에 임의의 길이의 텍스트에 매치될수 있다.

 

선택이 들어있는 표현식에서 캐럿 '^' 이나 달러 '$' 사용할 때는 항상 조심해야 한다.

 

^From|Subject|date:    ^(From|Subject|Data): 비교해 보면

 

실제 매치되는 문자열이 크게 다르고 용도도 완전히 다르다.

 

두번째 같은 경우 행시작뒤 From이나 Subject,Date 오고 뒤에 ': ' 매치됨



 

대소문자무시

2009 5 1 금요일

오전 10:02

대개 첫글자를 대문자로 쓰지만 대소문자 구분을 굳이 않해도 되는경우

 

[Ff][Rr][Oo][Mm] ->from 같은경우 이렇게 해도 되지만 귀찮고

 

 

대개 대소문자를 구분하지 않도록 도와주는 옵션이 존재한다.

 

Egrep 에서는 -i 옵션으로 대소문자 구분 무시 가능하다.


 

메타시퀸스 '\<','<\'

2009 5 1 금요일

오전 10:06

앞에서 cat,gray,smith 예를 말할때도 언급한적이 있지만

 

정규표현식이 단어에 매치되는 경우가 많다.

 

 

하지만 egrep 버전에 따라 단어 경계 인식기능 단어의 경계 매치하는 기능이 없는 경우도 있다.

 

 

 

 

'\<' '\>' 각각 한단어의 시작과 위치에 매치된다.

 

\<cat\>  이것은 단어 시작후 c,a,t 오고 다음에 단어가 끝나는것을 매치한다.



 

메타문자요약

2009 5 1 금요일

오전 10:12

메타문자

이름

매치대상

.

임의의 개의 문자

[]

문자 클래스

목록에 있는 문자중 하나

[^..]

부정형 문자 클래스

목록에 없는 문자중 하나

^

캐럿

행이 시작하는 위치

$

달러

행이 끝나는 위치

\<

백슬래시 <

단어가 시작하는 위치

\>

백슬래시 >

단어가 끝나는 위치

|

또는, 수직막대(bar)

수직막대로 구분된 표현식 하나에 매치됨

()

괄호

| 영역을 제한함 (그외 배우지 않은 용도로 )

그외 기억해야

문자클래스 안에서는 메타문자를 판단하는 규칙이나 의미가 다르게 적용된다.

 

예를 들어 점은 클래스 밖에서는 메타 문자로 인식되지만 클래스 안에서는 그렇지 않다.

 

그와 반대로 대시는 클래스 안에서 대부분 메타문자로 인식되지만

 

밖에서는 메타문자가 아니다. 또한 캐럿은 문자 클래스 밖에 있을때,

 

문자 클래스 안에서 '[' 기호 바로 뒤에 있을때, 클래스 안에서 다른위치에 있을때

 

각각 다른 의미를 가진다.

문자 클래스와 선택을 혼동하지 않도록 주의하자, 클래스인 [abc] 선택인

 

(a|b|c) 이경우에는 똑같은 의미를 가지지만 항상 같은 용도로 쓰이는 것은 아니다.

 

문자 클래스는 문자 목록의 길이에는 상관없이 정확하게 하나의 문자에만 매치된다.

 

반면에 선택은 그길이에 제한이 없고 부분이 전혀 상관없다.

 

\<(1,000,000|million|thousand thou)\> 같은 식으로 만들수도 있다,

 

하지만 선택은 문자 클래스처럼 부정형으로 만들수 없다.

부정형 문자 클래스는 단순히 열거되지 않은 문자에 모두 매치되는 일반적인 문자 클래스를 조금 간단하게 표기하는 방법에 불과하다. 따라서 [^x] "x 없으면 매치된다"

 

보다는 "x 아닌것에 매치된다" 라고 해석해야 한다. 차이는 상당히 미묘하면서도 중요하다. 전자와 같은 식으로 해석하면 예를 들어 아무 내용도 없는 빈줄에도 매치가 되지만 실제 [^x] 빈줄에 매치되지 않는다.

 

 

'정리안함 > 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 멍충한아싸

댓글을 달아 주세요