자바스크립트의 정규식 관련 함수는 왜 6개나 되는 걸까요? 객체도 RegExp와 String의 두 가지로 나뉘어 있고 말이죠. 이는 사실 좀 짜증나는 일입니다. 정규식 갖고 할 수 있는 일은 어차피 두 개뿐입니다. 하나는 검색이고 다른 하나는 치환입니다. 따라서 함수도 두 개면 충분할 것입니다. 실제로 split 함수 경우는 문자열을 쪼개서 배열에 담는 용도로 많이 쓰이고 있습니다. 즉, 기본적으로는 정규식과 관련이 없습니다. 그런데도 정규식 관련 함수에 포함된 이유는 구분자에 정규식을 지정할 수 있기 때문입니다.
에구, 이거 시작도 하기 전에 불만부터 늘어놓게 됐네요. 뭐, 어쩌겠습니까. 까라면 까야죠. 사실 String 객체 자체에는 정규식을 처리하는 기능이 없다고 합니다. 그래서 내부적으로는 RegExp 객체를 호출하게 됩니다. 그렇다면 처음부터 RegExp 객체를 호출하는 게 더 효율적이라는 얘기가 되겠네요. 하지만 그 차이는 사실상 제로에 가까울 겁니다. 요즘 컴퓨터 성능이 워낙에나 막강하니까요. 제가 프로그래밍을 처음 시작할 때만 해도 한 줄의 코드를 줄이기 위해 인라인 어셈블리까지 동원하는 등 속도 문제에 참으로 민감했었는데 요새야 어디 그러나요. 생산성이 훨씬 더 중요시되는 시대지요.
자바스크립트의 정규식 객체와 관련해서 꼭 알아두셔야 할 게 있습니다. 두 가지의 객체가 사용방법에 있어서 정반대라는 점입니다. 역시 예부터 보시죠.
<script language="javascript">
s = '123abc4';
if (/\d{3}/.test(s))
document.write('성공<br>');
else
document.write('실패<br>');
</script>
지난 회에 보셨던 예제입니다. 여기서는 RegExp 객체를 사용하고 있습니다. 이 예제에서 객체만 String으로 바꿔 보겠습니다. RegExp 객체의 test와 비슷한 일을 하는 String 객체의 메써드는 match입니다. 따라서,
<script language="javascript">
s = '123abc4';
if (s.match(/\d{4}/))
document.write('성공<br>');
else
document.write('실패<br>');
</script>
위와 같이 if문만 변경하면 됩니다. 여기서 test와 match 함수를 보면 웃기게도 문자열과 패턴의 위치가 바뀌어 있습니다. 자바스크립트를 설계한 사람이 아마도 술 한잔 걸치고 나서 작업한 게 아닐런지요... 특별한 이유도 없이 이처럼 일관성 없게 함수마다 왔다갔다 하면 정말 열받습니다. 암튼 규칙이 그러하니 우리야 따를 수밖에 없습니다만. 6개의 함수 중 가장 간단한 것은 test입니다. 이 함수는 오직 true와 false만 리턴합니다. 앞의 예제에서 본대로입니다. 주어진 패턴과 매치가 되면 true를, 아니면 false를 리턴합니다.
워낙 간단하니 별다른 설명은 필요없습니다. 다만 옵션에 대한 건 여기서 살펴봐야 합니다. 자바스크립트의 정규식에는 옵션이란 게 있습니다. 옵션이란 대소문자를 구분할 것이냐, 말 것이냐 등을 지정하는 일종의 플래그입니다. 이에 대한 건 설명이 좀 길어질 듯하니 다음 회로 미루겠습니다.