개발/Regular expression

[정규표현식] 정규표현식(Regular expression) (feat. javascript)

smile-haha 2023. 1. 8. 02:04
반응형

정규표현식(정규식)은 문자열에서 특정 문자 조합을 찾기 위한 패턴을 나타내는 문법으로

개발/문서 작성에서 알아놓으면 유용하게 사용된다.


1. 정규표현식(Regular expression)이란?

정규 표현식(정규식)은 문자열에서 특정 문자 조합을 찾기 위한 패턴

 

2. 언제 이용하는가?

2.1. 특정 형식의 문자열(e-mail 주소/전화번호/URL/RGB값/HEX값 등)인지 검사

//핸드폰번호 형식(3자리 숫자 - 3자리 or 4자리 숫자 - 4자리 숫자)인지 체크
const reg = /^\d{3}-\d{3,4}-\d{4}$/;
reg.test('010-223-1234');//true

 

2.2. 문자열에서 특정 값 제거/바꿔치기

//숫자 제거
'smile-haha@123kkeoq'.replace(/[0-9]/g,''); //'smile-haha@kkeoq'
//알파벳 소문자 제거
'smile-haha@123kkeoq'.replace(/[a-z]/g,'');//'-@123'
//숫자, 알파벳 소문자 제거
'smile-haha@123kkeoq'.replace(/[0-9a-z]/g,'');//'-@'

저는 보통 이런 때 사용합니다~예제를 javascript 기준으로 작성하였으나, 정규표현식은 java, javascript 뿐만아니라 다양한 언어에서 이용 가능하며, notepad++과 같은 문서/코드 편집기에서도 사용 가능하니 개발자라면 익혀두면 여기 저기 사용 가능하다.

 

3. 정규표현식 형식

/[패턴]/[플래그]

정규표현식은 패턴과 플래그로 이루어져 있다. 패턴은 검사할 문자열이 어떻게 생긴 녀석인지에 대한 정의, 플래그는 고급 검색 옵션으로 필수 값이 아니다. 

javscript를 이용하여 정규표현식을 생성할 경우, 아래와 같이 생성할 수 있다.

//생성자를 사용할 경우
const reg = new RegExp('pattern', 'flags');
//const reg = new RegExp('[0-9]', 'g');

//생성자를 사용하지 않을 경우
const reg = /pattern/flags;
//const reg = /[0-9]/g;

 

4. 정규표현식 패턴(pattern)

  4.1. Character Classes

  특정 문자를 의미하는 패턴

패턴 의미
. 문자 또는 숫자 또는 공백 하나
ex) ... : 문자열 길이가 3글자 이상인 것 찾기
\d
[0-9]
모든숫자
\D
[^0-9]
숫자가 아닌 모든 문자
\w
[A-Za-z0-9_]
밑줄을 포함하여 기본라틴 알파벳의 모든 영문자, 숫자
\W
[^A-Za-z0-9_]
밑줄을 포함하여 기본라틴 알파벳의 영문자, 숫자가 아닌 모든 문자
\s 공백, 탭, 양식공급, 줄바꿈 및  기타 유니코드 공백을 포함하여 단일 공백 문자
[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S 공백 이외의 단일 문자
[^\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\t 탭 문자
\r 캐리지 리턴
\n 계행 문자
\v 세로(수직) 탭
\f 폼 피드
\u{hhhh}
\u{hhhhhh}
유니코드 문자
u 플래그와 함께 사용해야 유니코드 문법이 인식된다.
ex)  \u{1F004}
x|y x 또는 y 
[a-c] == [a|b|c]

 

  4.2. Assertion

  행이나 단어의 시작/ 끝을 나타내는 경계와 앞/뒤 문자열에 대한 조건식이 들어간 패턴

패턴 의미
^ 문자열의 시작
$ 문자열의 끝
\b 단어(\w으로 이루어진)의 경계
단어 경계의 길이는 0
|my| |tistory| |blog| |is| |good|
\B 비단어의 경계
x(?=y) "x" 다음에 "y"가 오는 경우에만 "x"와 일치
ex) 딸기(?=바나나|키위)
"딸기바나나" (o)
"딸기키위" (o)
"딸기파인애플"(x)
x(?!y) "x" 다음에 "y"가 오지 않는 경우에만 "x"와 일치
(?<=y)x "x" 앞에 "y"가 오는 경우에만 "x"와 일치
(?<!y)x "x" 앞에 "y"가 오지 않는 경우에만 "x"와 일치

 

4.3. Groups and Range

그룹과 범위 표현하는 패턴

패턴 의미
x|y x 또는 y
[a-z] [] (브라켓) : 문자 집합.[] 안에 있는 문자열 찾음
-(레인지) : 하이픈(-)을 이용하여 문자의 범위를 지정할 수있음
※ 하이픈이 대괄호로 묶인 첫번째 또는 마지막 문자로 나타나면 범위를 의미하는 것이 아니라 하이픈(-) 그 자체를 의미
- [A-Z] 대문자 A에서 Z까지의 문자
- [ㄱ-ㅎ|ㅏ-ㅣ|가-힣] 한글
- [0-9] 숫자 
[^xyz]
[^a-c]
부정 또는 보완 문자. 대괄호([])로 묶이지 않은 모든 항목과 일치
^는 문자열의 시작을 나타낼 수도 있음
(x) 캡처링 그룹으로 묶임.
각 캡처 그룹은 결과 요소의 인덱스([1], [2]..., [n]) 또는 미리 정의된 RegExp 개체의 속성($1, $2, ..., $9)을 사용하여 일치 항목에 엑세스한다.
\n 캡처링된 문자열을 참조하여 검색에 다시 사용하는 방식
n은 양의 숫자로 앞서 지정한 캡처링에 대한 번호를 입력.

정규표현식 /(apple)(,)\s.+?\1\2/ 를 해석해 보자면, 
(apple)이 1번 캡처링 그룹, (,)가 2번 캡처링 그룹으로, /apple,\s.+?apple,/ 와 같다.
(?<Name>x) 명명된 캡처링 그룹. 캡처링 그룹에 이름을 붙임. 
명명된 캡처링 그룹 명은 RegExp의 exec 함수, String의 match함수, matchAll의 결과값으로 확인 가능하다.
(?:x) 비캡처 그룹. 이 형태를 패턴에 넣으면 그룹핑은 되지만 캡처링 되지 않는다.
문자열 패턴을 묶어서 처리하고 싶으나 캡처링이필요하지 않는 경우 활용
RegExp의 exec 함수, String의 match함수, matchAll의 결과에 캡처된 값이 나타나지 않음.

 

  4.4. Quantifiers(수량자)

  문자가 몇번이나 반복되는지를 나타내는 패턴

패턴 의미
x* "x"를 0회 이상 반복
x+ "x"를 1회 이상 반복
x? "x"를 0회 또는 1회 반복. 있거나 없거나를 의미
x{n} "x"를 n회 반복
※n은 양의 정수를 의미
x{n,} "x"를 n회 이상 반복
※n은 양의 정수를 의미
x{n,m} "x"를 n회 이상, m회 이하 반복
※n은 양의 정수를 의미
x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?
?는 탐욕적이지 않은 것을 의미하여 일치하는 항목을 찾으면 바로 중지시킨다.
"<foo> <bar> new </bar> </foo>".replace(/<.*>/,'')  //''
"<foo> <bar> new </bar> </foo>".replace(/<.*?>/,'')  //' <bar> new </bar> </foo>'

 

 4.5. 유니코드 속성

  - 유니코드 문자 속성 기반으로 문자를 찾는 패턴

\p{UnicodeProperty}
\P{UnicodeProperty}
유니코드 문자 속성을 기반으로 문자를 찾는다.
(이모티콘 문자, 일본어 가타카나 문자, 중국어 등)

 

5. 정규표현식 플래그(flag)

정규 표현식은 전역 탐색(g)이나 대소문자 무시(i)와 같은 특성을 지정하는 플래그를 가질 수 있다. 플래그는 단독으로 사용할 수도 있고, 순서에 상관 없이 한꺼번에 여럿을 지정할 수도 있다. 정규표현식을 이용하여 문자열을 변경하고자 할 때 사용된다.

플래그 설명
d 부분 문자열 일치에 대해 인덱스 생성
g 전역 탐색
i 대소문자를 구분하지 않음
m 여러 줄에 걸쳐 탐색
s 개행 문자가 .과 일치
u "unicode", 패턴을 유니코드 코드 포인트의 시퀀스로 간주
y 대상 문자열의 현재 위치에서 탐색을 시작

나는 g와 i를 주로 사용하고, 다른 플래그는 사용해본 기억이 없다... 다른 사람들 코드에서도 많이 못 본 것 같다.

 

 

📚참고문헌

 

Regular expressions - JavaScript | MDN

Regular expressions are patterns used to match character combinations in strings. In JavaScript, regular expressions are also objects. These patterns are used with the exec() and test() methods of RegExp, and with the match(), matchAll(), replace(), replac

developer.mozilla.org

 

 


🎃정규표현식 샘플을 확인하고 싶다면? 아래 예제는 어떠세요?

 

 

[정규표현식] 이메일 샘플

^0\d{1,2}(-|\))\d{3,4}-\d{4}$1. (일반적인) 이메일 특징 이메일 주소는 [ 로컬 부분 ]@[ 도메인 부분 ]으로 구성됨 1) 로컬 부분 - 대문자 및 소문자 라틴문자, 숫자 - 특수문자는 대부분 점(.), 밑줄(_),

smile-haha.tistory.com

 

 

[정규표현식] 전화/핸드폰 번호 샘플

🎈(일반적인) 전화/핸드폰 번호 특징 - 0으로 시작 - 0NZ-XXXX-YYYY 또는 0NZ)XXXX-YYYY 과 같은 패턴 ※ 유선전화의 경우 편의상 지역번호에 괄호를 치는 경우가 있다. - 첫번째 자리는 2자리(02) 또는 3자

smile-haha.tistory.com

 

[RegExp sample] HEX 타입 체크

🎈HEX란? 먼저 HEX 값은 색을 나타내는 표현 방식중 하나로, #과 16진수 6자리(+2자리)로 이루어져있다. 16진수는 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 으로 표현되며, 알파벳 대소문자는 구분하지 않는다. HEX 값

smile-haha.tistory.com

 

🎃정규표현식 테스트 사이트 & 시각화 사이트 참고

 

[정규표현식] 테스트 사이트

정규표현식을 작성할때, 저는 주로 크롬 개발자 도구의 console창에서 테스트를 해보고는 했습니다. 그런데 이번에 검색을 해보니 정규표현식을 테스트 하기 좋은 사이트가 있어서 소개해 보겠습

smile-haha.tistory.com

 

 

도움이 되셨으면 좋겠어요 ^--^

반응형