Hama Develop

Daily Study Logging28 - 정규표현식

May 25, 2020

Greedy Expression

정규 표현식 엔진은 기본적으로 그리디 하다. 무슨 뜻 이냐면, 숫자의 한계가 정해지지 않은 표현식을 가지고 탐색을 할때는, 그뒤의 표현식으로 넘어가지 않고 끝까지 탐색을 한다는 말이다.

풀어서 표현 했지만 더 무슨 말인지 모르는 말만 써져 있다.

예를 들어 보자.

/".+"/ 와 같은 정규 표현식이 있다. 이 표현식은 따옴표 안에 있는 아무 문자나 매치가 되게 되어 있다

hello I am “Jesse Cha” and she is “MJ” 라는 문자열을 해당 정규표현식으로 탐색하면, “Jesse Cha” and she is “MJ” 까지가 매치 된다. 왜냐하면, .+는 1개 이상의 아무 문자나 숫자를 의미하고 "또한 문자이기 때문이다. 따라서 Cha뒤의 "는 문자로 취급 받는다.

이렇게 끝까지 탐색을 마치고 나면 정규표현식 엔진은 아직 탐색해야 할게 남아있음을 눈치챈다. 그리고 뒤에서 부터 체크를 한다. 위 문장의 경우 뒤에서 부터 체크를 하자마자 "를 발견했다. 그 지점까지 확인을하고 탐색을 종료한다.

Lazy Expression

각 따옴표 별로 따로 매치가 되게 하고 싶으면 어떻게 할까? ?를 사용한다. 무한대까지 셀 수 있는 표현식(위의 예시에서는 +)바로 뒤에 ?를 붙이면 된다. 그럼 Lazy한 방식으로 동작한다.

/".+?"/g 처럼 정규 표현식을 사용해 보자.(g는 여러개 매치를 하기 위해 붙인 글로벌 옵션이다.) 그러면 “Jesse Cha” 와 “MJ”에 매치가 되는 것을 확인할 수 있다.

Lazy한 작동방식은 한문자가 지날때마다 그다음 정규표현식에 맞는 문자가 나왔는지 확인하는 방식이다.

우리의 예시에서는 "를 처음 발견하고 J를 발견한뒤 그 다음 문자가 "인지확인한다. 아니라면 .과 매치를 시킨다. 이를 반복하다가 다음문자가 "가 오면 매치를 완성시킨다.

이처럼 무한대로 문자를 포함할수있는 표현식을 쓸때는 Greedy 하게 할 지 Lazy하게 할지 생각을 한번 해야 한다.