regex에서 lazy quantifier가 어떻게 동작하는지 간단하게 알아봅시다.

 


 먼저 R{2,} 뒤에 ?를 붙였습니다. 이 때 ?는 lazy quantifier 역할을 합니다. match as few character as possible이라 되어 있는데요. 가능한 적은 문자를 match 한다고 되어 있습니다. greedy 속성과는 정반대임을 알 수 있습니다.

 

 

 RRRRR, RR이 있는데요. R{2,}에 매치되는데, 가능한 적은 문자로 매치되는 패턴은 어떤 것인가요? RRRRR에서는 RR입니다. 그 다음에 RRR에서 RR이 또 매치가 됩니다. 그렇기 때문에, RRRRR에서는 2개가 match 되고, RRR에서는 RR 하나만 매치가 됩니다. 이는, 패턴  R{2,}와는 다른데요.

 

 

 요래 입력하고 패턴을 찾아 보겠습니다.

 

 

 그러면 일단, 1번째 위치부터 match가 되긴 할 텐데요. R{2,} 패턴을 만족하는 가장 긴 패턴은 RRRRR이 됩니다. 고로, RRRRR이 뽑히게 됩니다. 2번째 줄 역시 R{2,} 패턴을 만족하니, RRR이 뽑히게 됩니다. greedy 속성인 셈입니다.

 


 조금 더 유명한 예제를 보겠습니다. <.*> 패턴을 먼저 봅시다. 아시다시피 이 패턴은 <가 먼저 나온 다음에, 아무 문자가 0번 이상 나와도 되고, 그 다음에 >가 나오는 패턴을 찾습니다.

 

 

 인풋은 <a>hello</a>입니다. 보면 1번째 위치에 <가 매치가 됩니다. 다음에 .*는 아무 문자나 0번 이상 반복되는 것을 찾습니다. 그리고 난 후 >가 나오는데요. <a>도 해당 패턴을 만족하지만, <a>hello</a> 또한 만족합니다. 고로, <a>hello</a>까지 매치 됩니다.

 

 

 반면에 <.*?>는 이야기가 다릅니다. 어떻게 매치될까요?

 

 

 먼저, <를 찾습니다. 1번째 위치입니다. 다음에 .*는 어떠한 문자라도 0개 이상 나오면 되는 패턴입니다. 빈 문자열, a, a>, a>h 등등이 만족할 겁니다. 그런데 뒤에 ?가 붙었기 때문에, 가능한 적은 문자로 매치되는 패턴을 찾습니다. <a>가 가장 적네요. 따라서 <a>가 매치됩니다.

 

 그 다음에 또 매치되는 것이 있을까요? hello</a>에서 <가 보입니다. 고로, 여기서부터 찾게 될 텐데요.

 

 

 그 다음에 .*가 나왔으므로, 어떠한 문자가 0개 이상 match 되는 패턴을 찾습니다. /, /a, /a>가 가능합니다. 그 다음에, >가 오는 패턴인데요. <.*?>이네요. 앞에 <, 뒤에 >가 오면서 중간에 .* 패턴이 오는데 가능한 적은 문자로 매치되는 패턴. </a>입니다. 따라서, </a>가 뽑히게 됩니다.

 

 


 여담. RA*R은 R로 시작하고, R로 끝나고 중간에 A가 0번 이상 반복되는 패턴이 올 수 있습니다. 그러면 아래 패턴에서 어떻게 match가 될까요? RRARRRARARAAAAARAAAA...A 이런 패턴에서요.

 

 

 2번째부터가 RAR이니까 이 부분이 매치될 거 같지만, 1번째 R부터 2번째 R까지도 RA*R에 매치가 됩니다. 따라서, RR이 먼저 매치가 되어 버립니다. 그 다음에는 어떤 부분이 매치가 될까요?

 

 

 ARRRA... 이런 꼴로 나가는데요. R이 처음으로 나오는 위치는 4번째 위치입니다. 그리고 5번째 위치도 R인데요. RR은 RA*R에 매치가 되니까, 이 부분이 뽑히게 됩니다. 다음에는 RAR이, 그 다음에는 RAAAAR이 매치되게 됩니다.