RegExp 객체의 메써드 중 test가 매치의 여부만 리턴하는데 비해 exec 메써드는 매치가 될 경우 그 결과를 객체로 리턴합니다. 매치가 안 될 때는 false가 아닌 null을 리턴합니다. 여기서 결과가 객체로 리턴된다는 대목이 중요합니다. 우선 예부터 보겠습니다.
<script>
var s = '123abc4b';
var res = /b/g.exec(s);
document.write(res);
</script>
이 예제를 실행시켜 보면 웹브라우저에 ‘b’가 찍혀 나옵니다. 여기서 이상하다는 생각이 안 드세요? 두 번째 줄을 다음처럼
var res = s.match(/b/g);
바꿔보면 어떻게 될까요? 이때는 웹브라우저에 ‘b,b’로 찍혀 나옵니다. g 옵션이 붙어 있으니 이는 당연한 결과입니다. 그렇다면 exec 메써드는 g 옵션을 인식하지 못 하는 걸까요? 그렇습니다. 이게 또 문제지요. 암튼 자바스크립트도 은근히 이상하다니까요. 제가 감히 버그라고 주장하긴 좀 그렇습니다만... 뭐, 설계 버그 혹은 스펙 버그 같은 것일 수는 있죠.
그렇다 해도 exec 메써드는 나름 기특한 구석이 있습니다. 매치되는 문자열의 인덱스를 함께 알려준다는 것이죠.
<script>
s = '123abc4b';
var res = /b/g.exec(s);
document.write(res + '<br>');
document.write(res.index + '<br>');
document.write(res.input + '<br>');
</script>
위의 예제에서 설명드릴 것은 exec 메써드의 리턴값 중 프로퍼티 index와 input입니다. index는 매치된 문자의 인덱스입니다. 위의 예에서는 4가 됩니다. 0부터 세기 시작하니까요. input 프로퍼티는 주어진 텍스트 그 자체입니다. 위의 예에서는 ‘123abc4b’가 됩니다.
에효, 이제 test와 exec에 관한 설명은 대충 끝난 것 같네요. 다음 회에서 String 객체들의 메써드에 대해 마저 알아보죠.