알아두면 편리한 문자처리 함수들 [4]

지난 글에서 예고했던대로 오늘은 STRMATCH라는 함수에 대하여 알아보겠습니다.

7. STRMATCH

이 함수는 그 이름에서 알 수 있듯이 대상 문자열을 비교 문자열과 비교하여 일치하는가 여부를 판단하여 알려주는 역할을 합니다. 좀 더 넓은 의미로 생각한다면, 대상 문자열내에 내가 지정한 비교 문자열이 포함되는가 아닌가의 여부를 확인하는 역할이라고도 볼 수 있습니다. 가장 기본적인 사용예제는 다음과 같습니다.

여기서 대상 문자열은 ‘Future’라는 단어이고 비교 문자열도 ‘Future’입니다. STRMATCH 함수의 첫번째 인자가 대상 문자열, 두번째 인자가 비교 문자열이 됩니다. 여기서는 대상 문자열과 비교 문자열이 서로 같으므로, 함수를 적용한 결과는 1(일치함)이 됩니다. 물론 다음과 같이 비교 문자열이 ‘future’가 될 경우에는 결과가 달라집니다.

여기서는 서로 일치하지 않으므로 결과는 0(불일치)이 됩니다. STRMATCH 함수는 기본적으로 대소문자 구분을 합니다. 만약 대소문자를 구분하지 않고 비교하게 하려면 FOLD_CASE라는 키워드를 사용하면 됩니다.

그런데 STRMATCH 함수는 * 또는 ?와 같은 와일드카드를 사용하여 좀 더 다양한 활용이 가능하다는 점을 주목해야 합니다. 와일드카드 임의의 갯수만큼의 임의의 문자(공백도 포함됨)를 의미합니다. 비교 문자열을 예를 들어 다음과 같이 정하는 경우를 봅시다.

여기서 사용된 비교 문자열을 보면 가운데에서는 tur이 존재하되 그 앞뒤로는 임의의 문자가 임의의 갯수만큼 존재해도 상관이 없다는 의미입니다. 따라서 그 결과는 1(일치함)로 얻어진 것입니다. 다음과 같은 경우들은 모두 일치한다는 결과를 주는 경우들입니다.

그리고 다음의 경우들은 불일치로 판정되는 경우들입니다.

아마 이 정도면 와일드카드 *의 사용요령은 설명이 된 것 같습니다. 와일드카드는 또 ?라는 것도 있는데, 이것은 임의의 문자 하나를 의미합니다. 공백은 포함되지 않습니다. 따라서 *와는 분명한 차이가 존재하며, ?는 *보다 덜 유연한 와일드카드라고 보면 되겠습니다. 다음과 같은 두 결과를 비교해보면 *와 ?의 차이를 알 수 있습니다.

여기서 result1과 result2는 각각 1과 0이 됩니다. 왜냐하면 result2의 경우는 F와 e 사이에 단 하나의 임의의 문자가 존재하느냐를 판단한 것이 되므로, 그 결과는 0(불일치)으로 나올 수 밖에 없습니다. 이러한 차이점을 잘 이해해둘 필요가 있습니다. 그 외에도 []를 사용하여 이 안에 포함된 문자들중 아무거나 해당되면 일치하는 것으로 판정하도록 하는 사용법도 있습니다. 예제는 다음과 같습니다.

여기서는 뒷부분의 u와 e 사이의 문자가 r, s, t 중 하나와 일치하기만 한다면 됩니다. 실제로는 r이 위치하므로 전체적으로도 1(일치함)이라는 결과를 얻게 됩니다. 물론 다음과 같은 경우에는 0(불일치)으로 판정됩니다. 왜냐하면 []안에는 r이 존재하지 않기 때문입니다.

어쨌든 이와 같이 다양한 와일드카드들을 활용함으로써 좀 더 다양한 방식의 비교가 가능해집니다. 이런 방법을 잘 활용하면 아스키 자료상에서 내가 원하는 형식을 갖는 문자열들만 추려내는 처리가 얼마든지 가능해집니다. 물론 이러한 방식의 문자 처리를 좀 더 방대하고 심오한 방식으로 수행할 수 있는 STREGEX라는 함수도 있습니다. 이 함수에서는 정규표현식이라고 하는 문자처리 체계를 사용하여 정말 다양한 방식의 처리가 가능한데요. 이 함수에 대해서는 사실 이러한 게시물에서 모든 것을 다 설명하기가 힘듭니다. 이와 관련된 자세한 내용은 IDL User Group 웹사이트의 문서자료실의 8번 게시물에 이 함수에 관한 심층적인 소개문서가 링크되어 있으니, 관심있으신 분들은 이 내용을 참조하시면 되겠습니다.