정규표현식 정리(1)

김서진·2024년 2월 7일

정규 표현식

정규 표현식은 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어다.
정규 표현식은 자바스크립트의 고유 문법이 아니고 대부분의 프로그래밍 언어와 코드 에디터에 내장되어 있다.

정규 표현식은 문자열을 대상으로 패턴 매칭 기능을 제공한다. 패턴 매칭 기능이란 특정 패턴과 일치하는 문자열을 검색하거나 추출 도는 치환할 수 있는 기능을 말한다.

다만 정규 표현식은 주석이나 공백을 사용;할 수 없고 여러 가지 기호를 혼합하여 사용해서 가독성이 좋지 않다.

정규 표현식의 생성

정규 표현식 객체의 생성에는 리터럴과 RegExp 생성자 함수를 사용할 수 있다.

const targetStr = 'Is this all there is?';

// 패턴 : is
// 플래그 : i => 대소문자 구별하지 않고 검색

const regexp = /is/i;

// test는 target 문자열에 대해 정규 표현식 regexp의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환
regexp.test(target); // true

RegExp 메서드

1. RegExp.prototype.exec

exec 메서드는 인수로 전달받은 문자열에 대해 정규 표현식의 매칭 결과를 배열로 반환한다. 매칭 결과가 없다면 null 반환.
exec 메서드는 문자열 내의 모든 패턴을 검색하는 g플래그를 지정해도 첫 번째 미칭 결과만 반환.

const target = 'Is this all there is?'
const regExp = /is/;

regExp.exec(target);
// ['is', ubdex: 5, input: 'Is this all there is?', groups: undefined]

2. RegExp.prototype.test

test 메서드는 인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환.

const target = 'Is this all there is?'
const regExp = /is/;

regExp.test(target); // true

3. String.prototype.match

String 표준 빌트인 객체가 제공하는 match 메서드는 문자열과 인수로 전달받은 정규 표현식과 매칭 결과를 배열로 반환

const target = 'Is this all there is?'
const regExp = /is/;

target.match(regExp);
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]

플래그

패턴과 함께 정규 표현식을 구성하는 플래그는 검색 방식을 설정하기 위해 사용한다.
플래그는 옵션이므로 선택적으로 사용할 수 있고 순서와 상관없이 하나 이상의 플래그를 동시에 설정가능하다.


패턴

패턴은 /로 열고 닫으며 문자열이 따옴표는 생략한다.

문자열 검색

const target = 'Is this all there is?';

대소문자를 구별하지 않고 검색하려면 플래그 i를 사용

const regExp = /is/i; 
target.match(regExp); // ['Is', index: 0, input: "Is this all tere is?', groups: undefined]

검색 대상 문자열 내에서 패턴과 매치하는 모든 문자열을 전역 검색하려면 플래그 g를 사용한다.

const regExp = /is/ig;
target.match(regExp); // ['Is', 'is', 'is']

임의의 문자열 검색

.은 임의의 문자 한 개를 의미한다. 내용은 무엇이든 가능하다.

const target = 'Is this all there is?';

임의의 3자리 문자열을 대소문자를 구별하여 전역 검색한다.
const regExp = / ... /g;

target.match(regExp); // ['Is ', 'thi', 's a', 'll ', 'the', 're ', 'is?'], 

반복 검색

const target = 'A AA B BB Aa Bb AAA';

{m, n}은 앞선 패턴이 최소 m번,  최대 n번 반복되는 문자열을 의미한다. 콤마 뒤에 공백이 있으면 정상 동작하지 않는다.
const regExp = /A{1,2}/g; target.match(regExp); // ['A', 'AA', 'A', 'AA', 'A']

{n}은 앞선 패턴이 n번 반복되는 문자열을 의미한다. 즉 {n}은 {n,n}과 같다.
const regExp = /A{2}/g; target.match(regExp); // ['AA', 'AA']

{n, }은 앞선 패턴이 최소 n번 이상 반복되는 문자열을 의미한다.
const regExp = /a{2,}/g; target.match(regExp); // ['AA', 'AAA']

+는 앞선 패턴이 최소 한번 이상 반복되는 문자열을 의미한다. 즉 +는 {1,}과 같다.
const regExp = /A+/g; target.match(regExp); // ['A', 'AA' , 'A', 'AAA']

?는 앞선 패턴이 최대 한 번(0번 포함) 이상 반복되는 문자열을 의미한다. 즉 ?는 {0,1}과 같다.
const target = 'color colour';
const regExp = /colou?r/g; target.match(regExp) // ['color', 'colour']

OR 검색

const target = 'A AA B BB Aa Bb';

|은 or의 의미를 갖는다.
const regExp = /A|B/g; target.match(regExp) // ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'B']

분해되지 않은 단어 레벨로 검색하기 위해서는 +를 함께 사용한다.
const regExp = /A+|B+/g; target.match(regExp); // ['A', 'AA', 'B', 'BB', 'A', 'B']

범위를 지정하려면 [] 내에 -를 사용한다.
const target = 'A AA BB ZZ Aa Bb';
const regExp = /[A-Z]+/g; target.match(regExp); // ['A', 'AA', 'BB', 'ZZ', 'A', 'B']

숫자를 검색하는 방법
const target = 'AA BB 12,345'; 

const regExp = /[0-9]+/g; target.match(regExp); // ['12', '345']

const regExp = /[0-9,]+/g; target.match(regExp); // ['12,345']

NOT 검색

[...]내의 ^은 not의 의미를 갖는다.
const target = 'AA BB 12 Aa Bb';

const regExp = /[^0-9]+/g; 
target.match(regExp); // ['AA BB ', ' Aa Bb']

참고자료

0개의 댓글