정규표현식 (regex / regular expression)

et Ji·2022년 12월 13일
0

개발지식

목록 보기
1/1

정규표현식 (regex / regular expression)


: 문자열에서 특정 문자 조합(패턴)을 찾기 위해 사용하는 형식의 언어이다.

**/pattern/flags**

: / / 안에 원하는 패턴을 작성하며, 뒤에 flag 옵션을 더할 수 있다.

패턴 작성 문법

Groups and ranges

Character
()그룹
[]문자셋, 괄호안의 어떤 문자든
[^]부정 문자셋, 괄호안의 어떤 문가 아닐때
(?:)찾지만 기억하지는 않음

Quantifiers

Character
?없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n}n번 반복
{min,}최소
{min,max}최소, 그리고 최대

Boundary-type

Character
\b단어 경계
\B단어 경계가 아님
^문장의 시작
$문장의 끝

Character classes

Character
\ 특수 문자가 아닌 문자
.어떤 글자 (줄바꿈 문자 제외)
\ddigit 숫자
\Ddigit 숫자 아님
\wword 문자
\Wword 문자 아님
\sspace 공백
\Sspace 공백 아님

플래그

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

자바스크립트에서 정규표현식 사용

메서드설명
exec()문자열에서 일치하는 부분을 탐색합니다. 일치 정보를 나타내는 배열, 또는 일치가 없는 경우 null을 반환
test()문자열에 일치하는 부분이 있는지 확인합니다. true 또는 false를 반환
match()캡처 그룹을 포함해서 모든 일치를 담은 배열을 반환합니다. 일치가 없으면 null을 반환
matchAll() 캡처 그룹을 포함해서 모든 일치를 담은 반복기를 반환
search()문자열에서 일치하는 부분을 탐색합니다. 일치하는 부분의 인덱스, 또는 일치가 없는 경우 -1을 반환
replace()문자열에서 일치하는 부분을 탐색하고, 그 부분을 대체 문자열로 변경
replaceAll() 문자열에서 일치하는 부분을 모두 탐색하고, 모두 대체 문자열로 변경
split()정규 표현식 또는 문자열 리터럴을 사용해서 문자열을 부분 문자열의 배열로 나눔

📗 예제

** 기본적으로 플래그는 gm으로 설정하여 실습함. 

* 기본 탐색
/Hi/gm

**< Groups and ranges >**

* Hi 또는 Hello 찾기
/Hi|Hello/gm

* 그룹으로 지정하여 찾기
/(Hi/Hello)/gm
// 위에서 |만 사용하여 찾았을 때와 달리, 찾은 결과값이 그룹으로 지정된 것을 확인 가능
/(Hi|Hello)|(And)/gm
// Hi와 Hello는 그룹 1에 해당 그룹 2는 undefined, And는 그룹 1은 undefined, 그룹 2에 해당

* grey, gray 찾기 1
/gr(e|a)y/gm

* grey, gray 찾기 2 : 찾아진 값을 그룹으로 보이지 않도록 탐색
/gr(?:e|a)y/gm

* grey, gray 찾기 3 : 해당하는 문자를 집합체처럼 처리해서 []안에 넣어준다.
/gr[ea]y/gm
/gr[a-f]y/gm
/gr[ead]y/gm

* 어떤 문자열이든 a-z, A-Z, 0-9까지, 모두 만족하는 문자 찾기
/[a-z]/gm
/[A-Z]/gm
/[0-9]/gm
/[a-zA-Z0-9]/gm

** 조건에 해당하지 않는 경우 찾기
/[^a-zA-Z0-9]/gm

**< Quantifiers >**

* a가 있는 경우와 없는 경우
/gra?y/gm

* a가 있거나 없거나 많은 경우
/gra*y/gm

* a가 하나만 있거나 많이 있는 경우
/gra+y/gm

* a가 최소 2개 최대 3개까지 있는 경우 / 최소만 지정해도 된다.
/gra{2,3}y/gm
/gra{2,}y/gm

**< Boundary-type >**

* 특정 문자열에서 단어의 시작부분에 있는 Ya 만 선택할 때
/\bYa/gm

* 특정 문자열에서 단어의 뒤에 Ya 만 선택할 때
/Ya\b/gm

** 위와 반대의 케이스 단어의 뒤에 쓰이지 않는 Ya 만 선택할 때 : Ya만 있는 단어는
Ya로 끝나는 단어이기도 하므로 선택되지 않는다!
/Ya\B/gm

* 문장의 시작과 끝에 있는 Ya를 선택할 때
** 시작
/^Ya/gm
**/Ya$/gm
*** 이때 플래그의 멀티라인 m을 선택하지 않으면, 전체적인 문장에서 찾지 않게 된다. 
: 전체 데이터 끝에 있는 Ya만 검색됨.
/Ya$/g

**< Character classes >**

* 특수문자 . (등등)을 찾을 경우
/\./gm
/\[\]/gm

*** 활용 예제 ***

1. 전화번호를 찾을 경우 : -, . , 공백으로 나눠져있음

1) 간단식
/\d\d\d-\d\d\d\d-\d\d\d\d/gm
2) 패턴 만들기 2가지 방식
/\d{2,3}[-. ]\d{3}[-. ]\d{4}/gm
/[0-9]{2,3}[-. ][0-9]{3}[-. ][0-9]{4}/gm

2. 이메일을 찾을 경우
// 나의 풀이
/[a-zA-Z0-9-.]{2,}\@\w{2,}\.[a-zA-Z0-9-.]{2,}/gm
// 선생님 풀이
/[a-zA-Z0-9._+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+/gm

3. 유튜브 주소 뒤에 아이디 값만 찾기

1) 패턴의 데이터 찾기.
/(https?:\/\/)?(www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm
// 소괄호를 이용하여 만들었기 때문에 데이터가 매칭된 것을 살펴보면, 그룹으로 나눠진 것을 
// 확인할 수 있다. 

2) 원하는 데이터는 아이디 값이므로, 앞의 주소 패턴 그룹은 제외해준다. 
/(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm

*** 자바스크립트에서 활용해보기

const regex = /(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/
// undefined
const url = 'https://www.youtu.be/-ZClicWm0zM'
// undefined
url.match(regex)
// * 함수로 매칭되는 데이터를 호출하면, 결과값이 배열로 리턴된다.
// 인덱스 0번에는 매칭되는 데이터 전체의 문자열,
// **인덱스 1번에는 매칭되는 그룹의 데이터가 들어있다.** 
// (2) ['https://www.youtu.be/-ZClicWm0zM', '-ZClicWm0zM', index: 0, input: 'https://www.youtu.be/-ZClicWm0zM', groups: undefined]
// 0 : "https://www.youtu.be/-ZClicWm0zM"
// 1 : "-ZClicWm0zM"
// groups : undefined
// index : 0
// input : "https://www.youtu.be/-ZClicWm0zM"
// length : 2
// [[Prototype]] : Array(0)

const result = url.match(regex);
//undefined
result[1];
//'-ZClicWm0zM'

🔗 출처

profile
codesign

0개의 댓글