달나라 노트

Google Apps Script : match, search, 정규표현식 (문자열 찾기, 문자열 위치 찾기, 정규표현, regular expression) 본문

Google Apps Script

Google Apps Script : match, search, 정규표현식 (문자열 찾기, 문자열 위치 찾기, 정규표현, regular expression)

CosmosProject 2022. 12. 1. 20:43
728x90
반응형

 

 

 

String 객체의 match와 search는 String에서 특정 문자열을 찾아줍니다.

이 두 method의 사용법과 차이점을 봅시다.

 

 

Syntax

String.match(text/reg)

 

match method는 String에 적용할 수 있으며 1개의 parameter를 받습니다.

 

- text/reg

String에서 찾을 문자(text) 또는 정규표현식(reg, regular expression)입니다.

match method는 String에서 text/reg와 일치하는 문자를 찾아 그 문자를 array에 담아서 return해줍니다.

여기서 특이한 점은 정규표현식(regular expression)을 사용할 수 있다는 것이죠.

 

 

 

 

String.search(text/reg)

 

search method도 String에 적용할수 있습니다.

parameter도 1개를 받으며 이는 match method와 완전히 동일합니다.

 

다만 search는 text/reg와 일치하는 문자를 String에서 찾아서 찾아진 문자의 위치(index)를 return한다는 차이가 있습니다.

 

 

 

 

 

 

function myFunction(){
  var test_string = 'Apple_Banana_Peach_Apple_Melon';

  Logger.log(test_string.match('a'));
  Logger.log(test_string.match('App'));
  Logger.log(test_string.match('z'));
}


-- Result
[a]
[App]
null

 

- test_string.match('a')

test_string에 match method를 적용했고 parameter는 'a' 입니다.

따라서 test_string에서 a를 찾으라는 의미입니다.

 

Apple_Banana_Peach_Apple_Melon

test_string에서 a는 총 4개가 찾아집니다. (대문자 A는 소문자 a와는 다르다고 판별되어 대문자 A는 찾아지지 않습니다.)

a가 일단 찾아졌으니 a를 array에 담아서 return합니다.

그래서 결과를 보면 [a] 로 출력되는 것을 알 수 있습니다. (여러 개가 찾아져도 하나만 return됩니다.)

 

 

 

- test_string.match('App')

test_string에 match method를 적용했고 parameter는 'App' 입니다.

따라서 test_string에서 App을 찾으라는 의미입니다.

 

Apple_Banana_Peach_Apple_Melon

test_string에서 App는 총 2개가 찾아집니다.

텍스트가 일단 찾아졌으니 찾아진 App라는 텍스트를 array에 담아서 return합니다.

그래서 결과를 보면 [App] 로 출력되는 것을 알 수 있습니다. (여러 개가 찾아져도 하나만 return됩니다.)

 

 

 

- test_string.match('z')

test_string에서 z는 찾아지지 않습니다.

이러한 경우 match method는 null을 return합니다.

 

 

 

 

 

 

 

 

이번엔 search method입니다.

 

function myFunction(){
  var test_string = 'Apple_Banana_Peach_Apple_Melon';

  Logger.log(test_string.search('a'));
  Logger.log(test_string.search('App'));
  Logger.log(test_string.search('z'));
}


-- Result
7.0
0.0
-1.0

 

- test_string.search('a')

test_string에 search method를 적용했으며 parameter는 'a'를 받았습니다.

따라서 test_string에서 a를 찾으라는 의미입니다.

 

Apple_Banana_Peach_Apple_Melon

test_string에서 a는 총 4개가 찾아집니다. (대문자 A는 소문자 a와는 다르다고 판별되어 대문자 A는 찾아지지 않습니다.)

찾아진 텍스트 중 가장 왼쪽에 있는 문자의 위치를 return합니다.

 

Apple_Banana_Peach_Apple_Melon

따라서 Ba에 있는 a의 위치가 return됩니다.

 

 

 

- test_string.search('App')

test_string에 search method를 적용했고 parameter는 'App' 입니다.

따라서 test_string에서 App을 찾으라는 의미입니다.

 

Apple_Banana_Peach_Apple_Melon

test_string에서 App는 총 2개가 찾아집니다.

App는 2개가 찾아졌는데 이 중 더 왼쪽에 있는 App의 위치를 return합니다.

따라서 0이 return됩니다.

 

 

 

- test_string.search('z')

test_string에서 z는 찾아지지 않습니다.

이렇게 문자를 찾을 수 없는 경우 z를 return합니다.

 

 

 

 

 

 

 

match와 search method의 기본적인 사용법을 알아봤으니

정규표현식에 대해서 알아봅시다.

 

그냥 text만을 전달하면 text 그 자체만을 찾게 됩니다.

하지만 정규표현식을 이용하면 특정한 패턴과 맞는 텍스트를 찾을 수 있습니다.

 

예시를 먼저 보시죠.

 

function myFunction(){
  var test_string = 'App le_Banana_12345Peach_Apple_Melon678910abe';

  Logger.log(test_string.search(/pp.e/));
  Logger.log(test_string.search(/[b-d]/));
  Logger.log(test_string.search(/[bdl]/));
  Logger.log(test_string.search(/[^a-cA-C]/));
}



-- Result
26.0
22.0
4.0
1.0

 

- test_string.search(/pp.e/)

parameter를 보시면 /pp.e/라는 특이한 문자가 적혀있습니다.

이것이 바로 정규표현식입니다.

 

정규표현식은 어떠한 문자열의 패턴을 나타내는 식입니다.

GAS의 정규표현식은 Javascript의 정규표현식 사용법과 동일합니다.

 

따라서 정규표현식을 적을 때에는 따옴표가 아닌 슬래쉬(/)를 양쪽으로 감싸서 표현해야합니다.

 

또한 /pp.e/에서 점.의 의미는 모든 텍스트 또는 모든 숫자 한글자를 의미합니다.

 

따라서 pp.e라는 것의 의미는

pp와 e 사이에 모든 텍스트/모든 숫자가 들어가있는 형태를 의미하죠.

pp.e의 패턴에 맞는 텍스트를 몇가지 예시로 들어보자면 아래와 같습니다.

ppae

ppze

pp5e

등등 위처럼 pp와 e 사이에 어떠한 문자나 숫자가 있는 것은 모두 pp.e 패턴에 해당됩니다.

 

단 점.은 하나의 글자를 의미하기 때문에 ppzzzze 이런것은 pp.e 패턴과는 다른 패턴으로 간주됩니다.

 

 

App le_Banana_12345Peach_Apple_Melon678910abe

test_string에서 pp.e 패턴을 찾아보자면 위처럼 두 번째 Apple의 pple가 찾아집니다.

첫 번쨰 App le은 pp와 e 사이에 공백과 l이라는 2개의 문자가 있으므로 패턴과 다릅니다.

따라서 두번째 Apple에 있는 pple의 위치인 26이 return됩니다.

 

 

 

- test_string.search(/[b-d]/)

일단 parameter를 보면 슬래쉬/로 감싸져있기 때문에 정규표현식이라는 것을 알 수 있습니다.

근데 슬래쉬 안에 [b-d]라고 적혀있습니다.

 

이렇게 대괄호 안에 무언가를 명시하면 대괄호 안에 있는 모든 문자 하나하나를 찾으라는 의미입니다.

또한 b-d는 알파벳순서대로 b부터 d까지를 의미합니다. 즉, b, c, d 3개의 문자를 의미하죠.

 

이를 종합하여보면 /[b-d]/는 b, c, d를 의미합니다.

 

따라서 test_string에서 b 또는 c 또는 d를 찾으라는 의미죠.

 

App le_Banana_12345Peach_Apple_Melon678910abe

test_string에서 b, c, d를 찾으면 위처럼 Peach의 c와 abe의 b 2개가 찾아집니다.

근데 더 앞쪽에 위치하는 Peach의 c 위치가 최종 결과로 return됩니다.

즉, 22가 결과로서 출력되는 것이죠.

 

 

 

- test_string.search(/[bdl]/)

parameter를 보면 /[bdl]/이라고 적혀있습니다.

일단 슬래쉬/로 감싸져 있으니 정규표현인 것을 알 수 있으며 대괄호가 있습니다.

대괄호의 의미는 대괄호 안에 있는 모든 문자 하나하나를 패턴으로서 찾으라는 의미입니다.

[bdl]의 의미는 바로 b, d, l이라는 알파벳을 찾으라는 의미죠.

 

App le_Banana_12345Peach_Apple_Melon678910abe

test_string에서 b, d, l을 찾으면 위처럼 총 3개가 찾아집니다.

그 중에서 가장 왼쪽에 있는 l의 위치가 return됩니다.

따라서 4가 출력됩니다.

 

 

 

- test_string.search(/[^a-cA-C]/)

parameter를 보면 슬래쉬로 감싸져있는 것을 보아 마찬가지로 정규표현식입니다.

그리고 대괄호가있죠.

 

대괄호 안에는 ^a-cA-C라고 적혀있습니다.

^의 의미는 좀 이따가 알아보고 a-cA-C의 의미부터 알아보죠

a-c는 a, b, c를 의미합니다.

그리고 A-C는 대문자 A, B, C를 의미합니다.

따라서 a-cA-C는 a, b, c, A, B, C를 뜻한다고 볼 수 있죠.

여기까지만 보면 test_string에서 a, b, c, A, B, C를 찾아라 라는 것으로 받아들일 수 있지만 앞에 ^기호가 있습니다.

^ 기호는 not이라고 보면 됩니다.

즉, 대괄호 안에 명시된 a-cA-C가 아닌 모든 문자를 의미합니다.

따라서 a, b, c, A, B, C를 제외한 모든 문자를 test_string에서 찾으라는 의미죠.

 

App le_Banana_12345Peach_Apple_Melon678910abe

test_string에서 a, b, c, A, B, C를 제외한 모든 문자를 찾으면 위 글자에서 빨간색으로 표시된 것들이 찾아집니다.

 

여기서 가장 왼쪽에 있는 것은 App의 p이므로 p의 위치인 index = 1이 return됩니다.

 

 

 

regular expression은 위처럼 사용할 수 있으며 regular expression에는 특수한 의미를 가진 기호들이 많이 존재합니다.

그 중 자주 사용되는 일부 기호들을 나타내보면 아래와 같습니다.

(참고로 regular expresstion에서 설명하는 문자는 단순히 알파벳, 숫자 뿐만 아니라 공백, 탭, 특수기호 등 컴퓨터에 존재할 수 있는 모든 문자를 의미합니다.)

 

Character Meaning Example
[xyz]
[a-c]
대괄호 안에 묶인 문자들 각각을 의미 [xyz] = x 또는 y 또는 z
[a-c] = a 또는 b 또는 c
^ not을 의미.
보통 대괄호 내부에 쓰이며 특정 문자를 제외한 나머지 문자를 나타내도록 할 때 사용
[^xyz] = x, y, z가 아닌 모든 문자/숫자
[^a-c] = a, b, c가 아닌 모든 문자/숫자
. 1개의 문자를 의미. a, b, c, \n, \r, \t
\d 0에서 9까지의 숫자 1개를 의미 [0-9]
\D 0에서 9까지의 숫자를 제외한 나머지 문자 1개를 의미 [^0-9]
\w 대문자 알파벳, 소문자 알파벳, 0~9의 숫자, underscore를 의미 [A-Za-z0-9_]
\W 대문자 알파벳, 소문자 알파벳, 0~9의 숫자, underscore를 제외한 나머지 문자를 의미 [^A-Za-z0-9_]
\s 1개의 공백을 의미 (여기서 공백이란 space, tab, form feed, line feed(줄바꿈, \n) 등 Unicode에 존재하는 모든 공백을 의미함)  
\S 공백을 제외한 모든 문자를 의미 [^/s]
\t 가로 탭을 의미  
\n 줄바꿈 (Line feed)  
{n} 패턴의 n회 반복 /[a-c]{3}/
위 패턴은 a 또는 b 또는 c가 3번 연달아 존재하는 패턴을 의미함.

aaa
aba
aca
ccc
bbb
acb
abc
...
| or /sky|cloud/
위 pattern은 sky 또는 cloud를 찾으라는 의미.

 

더 자세한 pattern 기호들은 아래 링크를 참고하면 좋습니다.

Link = https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes

 

 

 

 

 

 

728x90
반응형
Comments