Javascript

[Javascript] 한번에 끝내는 정규표현식(Regular Expression) 기초

apost 2023. 2. 3. 10:26

정규표현식은 문자열에서 특정한 규칙과 일치하는 조합을 찾는 규칙을 작성한 패턴입니다.

사전 정의된 특수문자(메타문자) 규칙을 조합해 찾고자 하는 패턴을 정의함으로써 복잡한 형태(거의 무제한)의 문자열 패턴을 만들어낼 수 있습니다.

자바스크립트는 정규표현식을 하나의 객체로 정의하며, RegExp 내장 객체를 사용해 정규표현식을 생성하고, 문자열에서 정규표현식과 일치하는 패턴을 검색할 수 있습니다.

 

정규표현식은 객체를 생성하는 생성자에 정규표현식 패턴을 인자로 넣어 생성합니다.

 

const re = new RegExp('정규표현식')

 

정규표현식은 일반 문자열을 검색하는 문자열 검색 메서드처럼 단순한 문자열을 찾는 것부터, 메타 문자(정규표현식에서는 커맨드의 역할)를 조합해서 복잡한 매칭 조건을 만들 수도 있습니다.

 

새 정규표현식을 하나 만들어보겠습니다.

 

let regex = new RegExp("/th/","g")

 

이 정규표현식은 다음처럼 축약해서 표현할 수 있습니다.

 

let regex = /th/g

 

자바스크립트에서 작성한 정규표현식은 문자열에 적용해서 매칭 결과를 얻을 수 있습니다.

 

let str = "There is no other way to go without you."
let regex = /th/
console.log(regex.exec(str))

 

 

자바스크립트 문자열 객체에는 정규표현식으로 검색을 하는 match() 메서드가 있습니다. 이 메서드를 사용해서 정규표현식 매칭을 해도 됩니다.

 

let str = "There is no other way to go without you."
let pattern=/th/
console.log(str.match(pattern))

 

매칭을 할 때 플래그(Flag)를 추가해서 매칭하는 검색 조건 범위를 조금 더 넓힐 수 있습니다.

플래그는 정규표현식 끝의 "/" 뒤에 붙여서 표기합니다.

 

플래그 용도
g 일치하는 모든 문자열을 찾아서 반환함.(배열)
i 대소문자를 구분하지 않음.

 

let pattern=/th/gi

 

 

정규표현식에 패턴 매칭을 위해 사용하는 메타문자의 종류는 상당히 많습니다. 

사용법에 익숙해지기 까지 시간이 조금 시간이 필요합니다.

종류별로 구분해서 정리한 메타 문자들의 기능은 다음과 같습니다.

 

 

 

문자(열) 매칭 메타문자

 

정규표현식에서 사용하는 미리 정의된 문자(열)를 선택하는 메타기호는 다음과 같은 것들이 있습니다.

정규표현식을 작성할 때 가장 빈번하게 사용하고, 또 중요합니다.

몇 가지 유니코드 및 제어 문자를 매칭하는 메타문자가 있지만 실제로는 거의 사용하지 않아서 제외했습니다.

 

 기호
의미 
[abc]
[a-c]
[abc]는 [a-c]와 같습니다. 알파벳 소문자 전체는 [a-z]가 됩니다. "-"는 중간에 있는 아스키 문자를 모두 포함합니다.
대괄호 안에 있는 문자(들)중 일치하는 문자를 매칭합니다.
[a-o]는 "non-automate" "u"를 매칭합니다.(하이픈은 매칭하는 문자가 아닙니다. 범위 지시자입니다.)
하이픈을 범위 지시자가 아닌 문자로 매칭 대상에 포함하려면 매칭 문자(들) 맨앞, 또는 맨뒤에 추가해야 합니다.
[abc-]는 a 또는 b 또는 c 또는 - 문자를 매칭합니다.

알파벳 대소문자만 선택할 때는 [A-Za-z]로 선택할 수 있습니다.
알파벳 대소문자와 숫자만 선택할 때는 [A-Za-z0-9]로 선택할 수 있습니다.
[A-Za-z0-9_-]는 특수문자를 제외한 모든 문자(Alphanumeric)를 선택합니다.
[^abc] 대괄호 안에 사용한 ^는 not의 의미입니다. 대괄호 안의 abc 문자가 아닌 나머지 문자를 선택합니다.
대괄호 바깥에서 사용할 때는 전체 문자열의 시작 위치를 표시하는 메타문자로 사용됩니다.

/[^a-m]/ 정규표현식은 "match" 문자열에서 "t"를 매칭합니다.
. 임의의 문자 1개를 매칭합니다.
줄바꿈 문자(\n, \r, \u2028, \u2029)는 제외됩니다.
\d 숫자를 매칭합니다.
[0-9]와 같습니다.
\D
숫자가 아닌 문자를 매칭합니다.
[^0-9]와 같습니다.
\w 알파뉴메릭 문자를 매칭합니다. 
[A-Za-z0-9_] 와 같습니다.
\W 알파뉴메릭(알파벳, 숫자, 언더바)이 아닌 문자를 매칭합니다.
[^A-Za-z0-9_] 와 같습니다.
\s
공백 1개를 매칭합니다. 공백에는 탭, 폼피드, 라인피드 또한 포함됩니다.
\S 공백이 아닌 문자 1개를 매칭합니다.
\t 탭 문자를 매칭합니다.
\r 캐리지 리턴 문자를 매칭합니다.
\n 줄바꿈 문자를 매칭합니다.
\ "\" 뒤에 표시한 문자를 이스케이프 처리해서 메타문자가 아닌 일반 문자로 처리되도록 합니다.
예외적으로 메타문자로 사용하는 경우가 있습니다. \B, \b 는 매칭 위치를 한정하는 메타 문자로 사용됩니다.
a|b 둘 중 하나라도 매치되면 매칭된 것으로 처리합니다. "|"는 or 연산자의 기능을 합니다. 

 

 

 

위치를 한정하는 메타문자

 

매칭하는 문자(열)가 매칭하려는 전체 문자열의 시작/끝, 또는 단어의 시작 끝 위치부터 매칭이 되는지를 확인하도록 위치를 한정하는 기호들입니다.

\B는 끝단이 아닌지를 확인하는 기호이므로 특별히 주의를 해서 봐야 합니다.

 

 기호
의미 
^
문자열 전체의 처음 시작 위치부터 매칭해서 일치하는지 확인합니다.
정규표현식 /^T/ 는 "the story of an hour"는 매치되지 않으며 "The story of an hour"는 매치됩니다.
$
문자열 전체의 끝 위치 문자가 매치되는지 확인합니다.
정규표현식 /hour$/ 는 "The story of an hour" 문자열에서 끝 부분 문자열 "hour"이 매치됩니다.
\b
한 단어의 끝부분에서 부터 일치하는지를 확인합니다.
"\b문자" 가 되면 단어의 시작 위치부터 일치하는지를 확인하고, "문자\b"가 되면 단어의 끝에서부터 일치하는지를 확인합니다.

정규표현식 /\bst/ 는 단어 "story" 에서 단어의 시작 부분이 매치되며, 정규표현식 /ry\b/ 는 "story" 단어의 끝부분과 매치됩니다.
/\bstory\b/ 는 " story " 처럼 공백으로 분리되어 양쪽 끝이 모두 일치하는,  전체 단어가 일치하는지를 확인합니다.
\b는 단어의 끝 그러니까 공백으로 분리되어 있는 문자열(단어)의 시작, 끝 부분을 기준으로 비교를 합니다.
\B
\b와 달리 단어 끝단이 아닌지를 확인합니다.
\b 매칭 방식 때문에 개념을 자주 혼동하는데, \b는 \b가 있는 방향이 단어 끝단이어야 하지만, \B는 \B가 있는 방향이 끝단이 아니어야 합니다. /\B문자/ 정규표현식은 \B가 있는 방향(여기서는 왼쪽)이 단어 끝단이 아니고 "문자"가 일치하는지를 찾습니다.

"story" 단어에서 정규표현식 /\Bry/ 는 매치되지만 /\Bst/는 매치되지 않습니다. 
같은 방식으로 /\Bor/도 매치가 됩니다. \B가 있는 방향이 단어 끝단이 아니기만 하면 됩니다.
x(?=y)
x 뒤에 y가 나오면 x를 매칭합니다. x 뒤에 y가 오는 조건부 매칭입니다.
/love(?=him|her)/ 정규표현식은 "love" 뒤에 "him" 또는 "her"가 오면 "love"를 매칭합니다.
x(?!y)
x(?=y) 매칭 조건과 반대입니다. x 뒤에 y가 오지 않으면 x를 매칭하는 조건부 매칭입니다.
/\w(?!(#|.))/ 정규 표현식은 "#" 또는 "."이 뒤에 오지 않는 문자열을 매칭합니다.
(?<=y)x
x 앞에 y가 나오면 x를 매칭합니다. x 앞에 y가 오는 조건부 매칭입니다.
/(?<=he|she)love/ 정규표현식은 "love" 앞에 "he" 또는 "she"가 오면 "love"를 매칭합니다.
(?<!y)x
(?<=y)x 매칭 조건과 반대입니다. x 앞에 y가 오지 않으면 x를 매칭하는 조건부 매칭입니다.
/(?<!(#|.))\w/ 정규 표현식은 "#" 또는 "."이 앞에 오지 않는 문자열을 매칭합니다.

 

 

 

그룹(Groups) 속성 메타문자

 

매칭에 사용한 매칭 키워드를 반환받는 매칭 결과 객체의 그룹(groups) 속성에 저장하고 있다가 나중에 매칭 키워드를 참조할 수 있습니다. 일부 웹 브라우저에서는 지원되지 않습니다.

 

 

 기호
의미 
(x)
매칭하는데 사용한 "x"를 매칭 결과 하위의 그룹 속성(groups)으로 반환합니다. 매칭에 사용한 "x"가 무었이었는지 참조할 때 사용할 수 있습니다.
정규표현식에 /g 플래그를 지정하면 그룹(groups) 속성이 반환되지 않습니다.
(?<Name>x) 매칭에 사용한 "x"를 매칭 결과 하위의 그룹 속성에 <Name> 이름으로 하위 속성을 별도 생성하고 "x"를 저장합니다. 매칭에 사용한 "x"를 나중에 참조할 수 있습니다.
(?:x)
매치된 "x"를 그룹(groups) 속성으로 기억하지 않습니다.

 

let text = "Heavy snow storm stroke SEOUL during Christmas season.";
console.log(text.match(/(?<keyword>st)/i))

 

 

 

 

문자의 개수를 한정하는 메타문자

 

 기호
의미 
.x
임의의 문자 한 개를 표현합니다. 임의의 문자 1개 뒤에 x 문자가 오는 것을 말합니다.
x+
x 문자가 한번 이상 반복됨을 말합니다. /yaho+/ 정규표현식은 "yahooooo" 는 매치되지만 "yah"는 매치되지 않습니다.
x*
x 문자가 0번 또는 그 이상 반복됨을 말합니다. /yaho*/ 정규표현식은 "yahooooo"가 매치되고, "yah"또한 매치됩니다.
x?
x 문자가 안나오거나 1번 나옵니다. or 조건입니다.
x{n}
x 문자가 n번 반복됩니다. 정확한 개수(n)만큼 일치해야 합니다. /u{2}/ 정규표현식은 "seoul"은 매치되지 않으며 "seouuul"은 처음 나오는 "uu"가 매치됩니다.
n은 양수입니다.
x{n,}
x 문자가 n번 이상 반복됨을 말합니다. x 문자가 n번 이상 나오면 모두 매칭됩니다.
/u{2,}/ 정규표현식은 "seouuul" 의 "uuu"가 매치됩니다.
n은 양수입니다.
x{n,m}
x 문자가 최소 n번 이상 최대 m 번 이하로 반복됩니다. 0 <= n < m 이어야 합니다.
/u{2,4}/ 정규표현식은 "seouuuuul" 의 처음 "uuuu"가 매치됩니다.
x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?
문자 개수로 매칭을 하는 정규표현식은 매칭이 가능한 최대의 문자열을 찾지만, 끝에 물음표를 붙인 정규표현식은 조건을 만족하는 최소 조건이 되면 매칭을 완료합니다.

/u+/ 정규표현식은 "seouuuuul" 문자열에서 "uuuuu"를 매칭하지만, /u+?/는 최소 조건인 "u"를 매칭하고 종료합니다.

 

 

 

 

정규표현식 작성을 연습해 볼  있는 사이트

 

https://regex101.com 

 

regex101: build, test, and debug regex

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET.

regex101.com

 

정규표현식을 작성하는데 도움을 주는 헬퍼 웹사이트입니다.

정규표현식 메타문자에 대한 도움말과 설명이 제공돼서 정규표현식을 작성하면서 도움을 얻을 수 있습니다.

작성하는 정규표현식을 테스트해서 문자열에서 어느 부분이 매칭되는지 실시간으로 확인할 수 있기 때문에 정규표현식을 빌드해 나가는데 많은 도움이 됩니다.