= 정규식 해석 엔진 =




정규식 아시져?? 헤헤


가끔씩 정규식 보믄 , 무슨 외계어 같은거고 잘 모르겠고

뭔가 좋은거 같은데 막상 쓰려니 막막하고 그러지 않나여??



현재의 정규식들은

기능이 굉장히 많이 확대되서

심지어는 정규식이 아닌 수준임 ( 나중에 설명하꼐요)



그렇지만 본래 제시된 정규식은 

다음의 세가지 요소와 괄호 개념으로만 이뤄졌어요



(a) : 괄호  정규식을 묶어버리죠, 사칙연산 수식에서 괄호처럼 생각하면 댐,


a|b : 유니온(union) ,  이건 OR 관계 처럼 보면 되요,  a  아니면 b 

ab :  concatenation , 어떤 기호가 없이 그냥 문자만 있지만 그 사이사이가  연결된 거에요,  ab 이렇게 붙어서 나오는거죠

a* : star-closure ,  그냥 클로져 라고 해요, 왜 이름이  Closure 일까요? 이거슨 정수론에서 \"정수집합에서 + 연산은 닫혀있다\" 라는 말이랑

비슷한 개념인 거에요, 근데 좀 받아들이기 힘들죠?? 수학적인 개념은 때려치우고 

그냥 앞에 있는 대상을 0번 이상 반복 한다고 생각하세요



이 세가지를 가지고 지지고 볶으면,  finite automata 가 인식할 수 있는 모든 스트링을 \"인식\" 할 수 있다고 해요


위 세가지 연산자들도 , 사칙연산과 같이 우선순위가 있어요

[공식적인 정규식 연산자 우선순위]
closure  >  concatenation > union


주의할점은 concatenation이 어떤 기호가 없다고 연산이 없다고 생각하시면 안됨, 

두개의 스트링을 연결시키는 연산인 거임 ㅇㅇ



세가지 연산자를 지지고 볶아보죠

예를 들면요

RE: l(ik|ov)e~*

가 있어요,  정규식에 있어서 아주 고전이죠

우선 스트링들 \"like\",  \"love\" 인식 할 수 있겠죠?  가운데 두 글자가 union 으로 묶여서  앞에놈 아니면 뒤엣놈 하나 선택이라서요

\"like~\", \"like~~\", \"like~~~\", .....
\"love~\",\"love~~\", \"love~~~\", .....

클로져가 ~ 문자를 0번 이상 반복 시키죠




흔히 보던 정규식보다 너무 간단해 보이죠??

근데, 저  \"공식적\" 인 정규식은

현재 가장 활용성 짱??이라는 펄 정규식하고 비교를 하면....






파워는 똑같아요 !! 레알임

다만 사용하기 빡치는거죠






몇가지 빡치는 예를 들면요


스트링이 주어졌을때

이게 숫자로만 이뤄졌는지 판단하려고 해요

최소한 숫자 하나라도 있는가 알아보는 정규식은

RE: (0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*


ㅋㅋㅋㅋㅋㅋ 존내 구리죠??

그럼 이런건 어떤가요

\'영문자 알파벳으로만 이루어진 스트링\'

\'영문자 대소문자 알파벳 혹은 언더바하나 혹은 숫자 로만 이루어진 스트링\'


(a|b|c|d.......

어휴 쓰기 빡쳐서 원


다 쓰기도 짜증나고 그렇죠?





이제 지금부터는 확장 정규식 개념이 들어감


위 빡치는 예를 해결하기 위해서

확장 정규식에서


문자클래스 라는 개념을 도입했어요

다 아실듯, 심지어 C언어 scanf 에서도 어설프게 쓰여요

[0-9] , [a-z], [A-Z],  [a-zA-Z0-9_]

뭐 이런식으로 쓰고 어떤 의미인지 알겠죠??


위와 같이 주로 \"범위\" 의 개념을 나타내지만

본래 문자클래스의 역할은..


RE: [ahz] , a 나 h나 z 중에 하나 선택

이런거에요

무조건 \"문자 한개\" 에만 대응되요

여러개 대응되는가 보려면  클로져를 달아주면 되겠죠??



RE: [^aeiou] 

위와 같은 경우는 문자 클래스 맨 앞에  \'hat\' 이 쓰였죠?? 이 정규식의 의미는?

a,e,i,o,u, 를 제외한 다른 문자들이 가능 한 거에요, 즉 

맨앞에 \'hat\' 이 붙으면  부정의 의미를 지니는 거죠...


어 그럼 \'^\' 문자 자체를 문자클래스 안에서는 못쓰는 것인가?? 하는 의문이 생길수도 있는데

\'^\' 를 쓰려면 그냥 맨앞에 안써주기만 하면 되요 

RE: [a^]   이것 처럼요





quantifier 확장


위에 기본 정규식에서 클로져 있자나요??

이놈을 quantifier 라고 불러요, 수량자?? 라고 불르죠


근데 0번 이상 반복, 말고도 

1번 이상 반복도 하고 싶고 그렇단 말이죠



그래서



a+ , 플러스가 붙으면 앞 대상을 1번 이상 반복한다 생각하시믄 대여

a? ,  앞 대상이 있을 수도 있고 없을 수도 있는 거에요


동일한 효과가 날법한 정규식 써보면

RE: (a|)   이건 불가능해요 , 근데 되는 정규식 엔진도 있대요



+ 가 수량자임은 그럴싸해도

? 가 수량자라고 하기엔 좀 빈약한거 같죠?? 

근데 실제 내부적으로 비슷하게 동작해요...






Escape 

정규식을 잘 보면 이런 경우가 생길수도 있음을 알수 있죠


\"어 난 \'(\'  문자 쓰고 싶은데 어뜩하지?? , 난 * 문자 쓰고 싶은데 이건 클로져를 의미해서 못쓰는데...\"

할 수 있죠


이런 특수기능을 하는 문자 자체를 쓰고 싶은 경우가 생기는데

이때 이 문자를 가지고 이런 특수기능에서 문자를 escape  \"탈출\" 시켜 그냥 그대로의 문자로 인식하게 할 수 있어요


방법은 ...


앞에 \\ 문자를 붙이는 거죠...

그래서 저 문자는 \"원(윈도우기준)\" 도 아니고 \"역슬래쉬\" 라고 부르지 않고 그냥

escape문자라고 불러요



RE: \\(\\)ab\\*   근데 이건 정규식 엔진마다 달라요,  VIM은 \\ 를 붙여야 특수기능이 살아나더라고요




그외 몇가지 특수 escape 


escape라고 보기엔 뭣하지만

escape 문자와 결합하여

특수기능을 오히려 살리는 경우가 있어요



주로 

RE: \\n  \\t

같이 공백을 나타낼때 주로 씀 ㅇㅇ




그외 여러가지 많은데요 진짜

확장하기 나름이에요



다음엔

이 확장 정규식을

Strong LL(0) 이라는 파싱방법을 사용하여

인식하게 만들어 볼꺼에연