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하게 할지 생각을 한번 해야 한다.