[TIL] 정규 표현식

ㅜㅜ·2022년 12월 12일
1

Today I learn

목록 보기
71/77
post-thumbnail

정규 표현식

정규표현식(정규식:正規式)은 문자열에서 특정한 규칙에 따른 문자열 집합을 표현하기 위해 사용되는 형식 언어이다.

정규표현식은 특정한 규칙을 갖는 문자열로 이루어진 표현식이며, 정규표현식에서의 특수 문자는 각각의 고유한 규칙을 갖고 있습니다. 우리는 이러한 규칙들을 조합하여 원하는 패턴을 만들고, 특정 문자열에서 해당 패턴과 대응하는 문자를 찾을 수 있음.

정규 표현식 사용

‘리터럴 패턴’‘생성자 함수 호출 패턴’ 두 가지 방법으로 사용 가능.

  • 리터럴 패턴 : 정규표현식 규칙을 슬래시(/)로 감싸 사용한다. 슬래시 안에 들어온 문자열이 찾고자 하는 문자열이다.

  • 생성자 함수 호출 패턴 : RegExp 객체의 생성자 함수를 호출하여 사용함.





정규식 패턴

정규식 패턴설명
^줄 시작에서의 일치 (/^abc/)
$줄 끝에서의 일치 (/xyz$)
.(특수기호, 띄어쓰기를 포함한) 임의의 한 문자
a|ba or b와 일치, 인덱스가 작은 것을 우선 반환
*0회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {0,}와 동일
*?0회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {0}와 동일
+1회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {1,}와 동일
+?1회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {1}와 동일
{3}숫자 3개 연속 일치
{3,}3개 이상 연속 일치
{3,5}3개 이상 5개 이하 연속 일치
()캡쳐(capture)할 그룹
[a-z]a부터 z 사이의 문자 구간에 일치 (영어 소문자)
[A-Z]A부터 Z 사이의 문자 구간에 일치 (영어 대문자)
[0-9]0부터 0 사이의 문자 구간에 일치 (숫자)
\escape문자로 특수 기호 앞에 역슬래쉬를 붙이면 정규식 패턴이 아닌 기호 자체로 인식
\D숫자가 아닌 문자를 검색함. /[^0-9]/와 동일
\d숫자를 검색함. /[0-9]/와 동일
\w영어 대소문자, 숫자, _(underscore)를 검색함. /[A-Za-z0-9]/와 동일
\W영어 대소문자, 숫자, _(underscore)가 아닌 문자를 검색함. /[^A-Za-z0-9]/와 동일
[^]]안의 문자열 앞에 ^이 쓰이면 []안에 없는 문자를 검색함




정규식 활용 예제

문자열 str이 주어질 때, str의 길이가 5 또는 7이면서 숫자(0~9)로만 구성되어 있는지를 확인해 주는 함수를 작성하라. 결과는 Boolean으로 리턴해야 함.
예를 들어 str가 c2021이면 false, 20212이면 true를 리턴한다.

// 정규표현식 사용
function solution(str) {
    return /^\d{5}$|^\d{7}$/.test(str);
}

// 정규표현식 미사용
function solution(str) {
	if(str.length === 5 || str.length === 7) {
		for(let i = 0; i < str.length; i++) {
			if(typeof Number(str[i]) !== 'number') return false;
		}
		return true;
	}
	return false;
}




정규식 내장 메서드

RegExp 객체의 매서드

메서드설명
exec()execution의 줄임말, 원하는 정보 뽑아낼 때 사용. 찾고자 하는 문자열 있으면 이를 배열로 반환하고, 없다면 null을 반환
test()찾고자 하는 문자열이 대상 안에 있는지 여부를 boolean으로 리턴
//exec
let pattern = /c/; // 찾고자 하는 문자열
pattern.exec('codestates') // 검색하려는 대상을 exec 메소드의 첫 번째 인자로 전달

// 즉, 'codestates' 가 'c' 를 포함하고 있는지를 확인함.
// 이 경우 'c' 가 포함되어 있으므로, ['c'] 를 반환한다.



//test
let pattern = /c/;
pattern.test('codestates');
// 이 경우는 'codestates'가 'c'를 포함하고 있으므로 true 를 리턴한다.

String 매서드

메서드설명
match()RegExp.exec()와 비슷한 기능을 하며, 정규 표현식을 인자로 받아 주어진 문자열과 일치된 결과를 배열로 반환하고, 없으면 null을 반환
replace()검색 후 바꾸기 수행. 첫번재 인자로 정규표현식, 두번째 인자로 치환하려는 문자열 받음. 변경된 값 리턴.
split()주어진 인자를 구분자로 삼아, 문자열을 부분 문자열로 나누어 그 결과를 배열로 반환
search()정규표현식을 인자로 받아 가장 처음에 매칭되는 부분 문자열 위치를 반환함. 매칭되는 문자열 없으면 -1반환
//match
let pattern = /c/;
let str = 'codestates';
str.match(pattern);
// str 안에 pattern 이 포함되어 있으므로, ['c'] 를 반환한다.


//replace
let pattern = /c/;
let str = 'codestates';
str.replace(pattern, 'C');
// str 안에서 pattern 을 검색한 후 'C' 로 변경하여 그 결과를 리턴.
// 'Codestates'가 반환된다.


//split
"123,456,789".split(",")  // ["123", "456", "789"]
"12304560789".split("0")  // ["123", "456", "789"]


//search
"JavaScript".search(/script/); // -1 대소문자를 구분합니다
"JavaScript".search(/Script/); // 4
"codestates".search(/ode/); // 1

flag

정규표현식은 플래그를 설정해 줄 수 있으며, 플래그는 추가적인 검색 옵션의 역할을 해줌.

플래그설명
ii를 붙이면 대소문자를 구분하지 않는다.
gglobal의 약자로 검색된 모든 결과를 리턴한다.
m다중행을 검색한다. (다중행을 검색하게는 해주지만, g를 함께 붙여주지 않을 경우 검색 대사을 찾는 순간 검색을 멈춘다)
//i
let withi = /c/i;
let withouti = /c/;
"Codestates".match(withi); // ['C']
"Codestates".match(withouti); // null

//g
let withg = /c/g;
let withoutg = /c/;
"coolcodestates".match(withg); // ['c', 'c']
"coolcodestates".match(withoutg); // ['c'] g 가 없으면 첫 번째 검색 결과만 반환

//m
let str = `1st : cool
2nd : code
3rd : states`;
str.match(/c/gm)
// 3개의 행을 검색하여 모든 c 를 반환
// ['c', 'c']
str.match(/c/m)
// m은 다중행을 검색하지만 g 를 빼고 검색하면 검색 대상을 찾는 순간 검색을 멈추고
// 첫 행의 ['c'] 만 리턴한다

정규 표현식 연습해볼 수 있는 페이지

profile
다시 일어나는 중

0개의 댓글