정규표현식 (regex) 자바스크립트 메소드 & 기본 문법

YS_Study.log·2022년 3월 3일
0

정규표현식 (regular expression)


정규표현식(regular expression)은 문자열에서 특정한 문자를 찾아내는 도구이다. 이 도구를 이용하면 수십줄이 필요한 작업을 한 줄로 끝낼 수 있다!
정규표현식은 자바스크립처럼 하나의 언어이며, 수많은 언어들이 정규표현식을 사용한다.

정규표현식 사용하는 2가지 방법 (결과는 동일)

리터럴 패턴

정규표현식 규칙(패턴)을 슬래시(/)로 감싸 사용하며, 슬래시 사이의 문자열을 찾는 명령을 내리는 것이다.
생성자 함수 호출 패턴: let pattern(변수) = new RegExp ('찾고자하는 대상') (소괄호 ('')감싸는 패턴)

let pattern(변수) = /찾고자 하는 대상/

let pattern = /a/;
// /a/ a가 찾고자하는 대상이라는 것을 알려주는 것

생성자 함수 호출 패턴

RegExp 객체의 생성자 함수를 호출하여 사용한다.

let pattern(변수) = new RegExp ('찾고자하는 대상') (소괄호 ('')감싸는 패턴)

let pattern = new RegExp('a');
// new RegExp 를 사용하여 정규표현식 객체를 만들고 소괄호 속 a를 찾고자한다는 것

찾고자하는 것을 패턴이란 변수에 담고 패턴이란 변수를 통해서 찾고자 하는 것을 사용할 수 있게 되는 것 이다.


정규표현식을 통해서 하는 중요한 작업 3가지

추출(exec), 검색(test), 치환(replace)

정규표현식으로 하는 중요한 작업은 필요한 정보를 추출하는 것, 자신이 확인하고자 하는 정보가 있는지 특정 패턴에 대응하는 문자열을 검색하는 것, 검색된 정보를 다른 정보로 치환하는 것으로 대표적으로 3가지가 있다.
이 작업을 할 수 있는 자바스크립트 내장 메소드와 사용방법을 알아본다.


RegExp 객체의 메소드

exec() : 추출

exec 는 execution 의 줄임말로, 원하는 정보를 뽑아내고자 할 때 사용한다.
찾고자 하는 대상을 첫번째 인자로 전달 하여, 인자 속에 찾고자 하는 대상이 있다면 해당 대상을 값으로 하는 배열을 리턴하며, 찾는 문자열이 없다면 null을 리턴한다.

  • . : 하나의 문자, . 점은 특수한 기호여서 문자뒤에 있다면 어떤 문자든 간에 하나의 문자를 뜻한다. (맨 아래의 정규표현식 문법들이 목록화 되어있다.)
let pattern = /a/;
pattern.exec('abcde');
// ["a"]
// 찾고자하는 정보 -> 문자열 a
// pattern변수에 'a'를 찾겠다는 의지가 있다.
// .exec 정규표현식을 사용하여 인자에 a가 있는지 찾는다.
// a 가 있으므로 ["a"]를 출력함

let pattern = /a./;
pattern.exec('abcde');
// ["ab"]
// 찾고자하는 정보 -> /a./; 문자열 a와 어떤 문자

let pattern = /a/;
pattern.exec('bcde');
// null
// a 가 없을 경우

test() : 검색

찾고자 하는 문자열(인자에)이 대상 안에 있는지의 여부를 boolean 으로 리턴한다.

let pattern = /a/;
pattern.test('abcdef');
// 'abcdef' 인자(문자열)에 a를 포함하고 있어서 true 

String 객체의 메소드

문자열에서 정규표현식을 사용할 수 있다는 메소드

match() : 추출

RegExp.exec() 와 비슷한 기능을 하며, 정규 표현식을 인자로 받아 주어진 문자열과 일치된 결과를 배열로 리턴하며, 일치되는 결과가 없으면 null 을 리턴한다.

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"]

정규표현식을 인자로 받아 가장 처음 매칭되는 부분 문자열의 위치를 반환합니다. 매칭되는 문자열이 없으면 -1을 반환합니다.

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

flag : 추가적인 검색 옵션

정규표현식은 플래그를 설정할 수 있다.
플래그는 추가적인 검색 옵션의 역할을 하는데, 각자 혹은 함께 사용하는 것이 모두 가능하며, 순서에 구분이 없다.

자주 사용되는 3가지 플래그

i

i를 붙이면 대소문자를 구분하지 않습니다.

let withi = /c/i;
let withouti = /c/;
"Codestates".match(withi); // ['C']
"Codestates".match(withouti); // null

g

global 의 약자로, g 를 붙이면 검색된 모든 결과를 리턴합니다.

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

m

m을 붙이면 다중행을 검색합니다.

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

정규표현식 패턴 문법

정규표현식의 문법은 그룹과 레인지, 수량, 단어경계, 문자로 총 4가지 그룹으로 나눠볼 수 있다.

Groups and ranges (그룹, 레인지)

Chracter
또는 (조건 중 하나라도 매칭되는 것)
() 소괄호그룹지정
[] 대괄호대괄호 내의 모든 문자중 하나라도 일치하는 문자를 검색 / ex) [a-z] / a부터 z까지 or [abcde] a부터 e까지
[^]부정, []안의 문자열 앞에 ^이 쓰이면, []안에 없는 문자를 검색
(?:)조회하지만 데이터로 기억하지는 않을때 (소괄호 있어도 그룹화되지 X)

Quantifiers (수량)

Chracter
?없거나 있거나 (zero or one) / ex) codin?g n이 있는 경우 없는 경우 -> codig / coding 모두 조회
*없거나 있거나 많거나 (zero or more) ex) codin?g -> n이 codinnnng 도 조회
+하나 또는 많이 (one or more) / ex) codin?g -=> n 없는 경우 조회 X => codig은 찾지 X
{n}n번 반복되는 문자 조회
{min,}최소 몇번 이상 반복되는 문자 조회
{min,max}최소, 최대 몇 까지 반복되는 문자 조회

Boundary-type (단어경계)

Chracter
\b단어 첫부분과 끝부분의 경계지정, / ex) \b단어 => 단어 앞에서 있는 문자만 단어 \b => 단어 뒤에 있는 문자만
\B단어 경계가 아님 \b 정반대 방식 /
^문장의 시작에서 일치하는 문자 ex) /^abc/
$문장의 끝에서 일치하는 문자 ex) /abc$/

Character classes (문자)

Chracter
\ (역슬레쉬)\특수문자, 특수 문자 자체
.모든 문자(한 문자), 줄바꿈 문자만 제외
\w모든 문자 검색
\W문자 아닌 모든 것을 검색
\ddigit 숫자 검색
\D숫자가 아닌 모든 문자 검색
\sspace 공백
\Sspace 공백 아닌 모든것

코드스테이츠
생활코딩
드림코딩엘리-정규표현식

profile
느리지만 조금씩 공부하는 중 입니다. 현재 1년 6개월차 신입입니다 ><!

0개의 댓글