본문 바로가기

JavaScript

[Deep dive] 31장 RegExp

31.1 정규 표현식이란?

 

정규 표현식(regular expression)

 

- 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어 (formal language)

- 문자열을 대상으로 패턴 매칭 기능 제공

- 패턴 매칭 기능

  : 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있는 기능

- 정규 표현식을 사용하면 반복문과 조건문 없이 패턴을 정의하고 테스트하는 것으로 간단히 체크 

 

31.2 정규 표현식의 생성

 

1) 정규 표현식 리터럴 

 

 - 패턴과 플래그로 구성

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

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

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

 

2) RegExp 생성자 함수 

 

- 변수를 사용해 동적으로 RegExp 객체 생성 가능

const count = (str,char) => (str.match(new RegExp(char,'gi')) ?? []).length;

count('Is this all ther is?', 'is'); //3
count('Is this all there is?', 'xx'); //0

 

31.3 RegExp 메서드 

 

31.3.1 RegExp.prototype.exec

- 인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 배열로 반환

- 매칭 결과가 없는 경우 null을 반환 

- 문자열 내의 모든 패턴을 검색하는 g플래그를 지정해도 첫 번째 매칭 결과만 반환

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

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

 

31.3.2 RegExp.prototype.test

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

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

regExp.test(target); //true

 

31.3.3 String.prototype.match

- 대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환

- g 플래그가 지정되면 모든 매칭 결과를 배열로 반환

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

target.match(regExp); //[ 'is', 'is' ]

 

31.4 플래그 

 

- 정규 표현식의 검색 방식을 설정하기 위해 사용 

- 순서와 상관없이 하나 이상의 플래그를 동시에 설정 가능

- 기본값 : 대소문자 구별, 첫번째 매칭 대상만 검색하고 종료 

플래그 의미 설명
i Igonre case 대소문자를 구별하지 않고 패턴을 검색
g Global 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색
m Multi line 문자열의 행이 바뀌더라도 패턴 검색을 계속

 

31.5 패턴

- 문자열의 일정한 규칙을 표현하기 위해 사용 

- 패턴은 /로 열고 닫으며 문자열의 따옴표는 생략

 

31.5.1 문자열 검색

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

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

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

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

 

31.5.2 임의의 문자열 검색 

- .은 임의의 문자 한 개를 의미 

const target = 'Is this all there is';

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

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

 

31.5.3 반복 검색

- {m.n}은 앞선 패턴이 최소 m번, 최대 n번 반복되는 문자열 

- 콤마 뒤에 공백이 있으면 정상동작하지 않음

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

//'A'가 최소 1번 최대 2번 반복되는 문자열을 전역 검색
const regExp = /A{1,2}/g;

target.match(regExp);
//[ 'A', 'AA', 'A', 'AA', 'A' ]

- {n}은 앞선 패턴이 n번 반복되는 문자열 

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

//'A'가 2번 반복되는 문자열을 전역 검색
const regExp = /A{2}/g;

target.match(regExp);
//[ 'AA', 'AA' ]

- {n,}은 앞선 패턴이 최소 n번 이상 반복되는 문자열 

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

//'A'가 최소 2번 이상 반복되는 문자열을 전역 검색
const regExp = /A{2,}/g;

target.match(regExp);
// 'AA', 'AAA' ]

- + 는 앞선 패턴이 최소 한번 이상 반복되는 문자열 

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

//'A'가 최소 한번 이상 반복되는 문자열을 전역 검색
const regExp = /A+/g;

target.match(regExp);
// [ 'A', 'AA', 'A', 'AAA' ]

- ?는 앞선 패턴이 최대 한번(0번 포함) 이상 반복되는 문자열

const target = 'color colour';

//'colo'다음 'u'가 최대 한번(0번 포함)이상 반복되고 'r'이 이어지는
//문자열 'color ,colour'을 전역 검색
const regExp = /colou?r/g;

target.match(regExp);
//[ 'color', 'colour' ]

 

31.5.4 OR 검색

- | 는 or의 의미를 가짐

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

//'A'또는 'B'를 전역 검색
const regExp = /A|B/g;

target.match(regExp);
//[ 'A', 'A', 'A','B', 'B', 'B','A', 'B']

- [ ] 내의 문자는 or로 동작 

- [ ] 뒤에 +를 사용하면 앞선 패턴을 한 번 이상 반복

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

//'A'또는 'B'가 한 번 이상 반복되는 문자열을 전역 검색
const regExp = /[AB]+/g;

target.match(regExp);
//[ 'A', 'AA', 'B', 'BB', 'A', 'B' ]

- 범위를 지정하려면  [ ] 내의 -를 사용

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

//'A'~ 'Z'가 한 번 이상 반복되는 문자열을 전역 검색
const regExp = /[A-Z]+/g;

console.log(target.match(regExp));
//[ 'A', 'AA', 'B', 'BB', 'A', 'B' ]

- \d는 숫자를 의미 \d는 [0-9]와 같음 

 \D는 숫자가 아닌 문자를 의미 

 

- \w는 알파벳, 숫자, 언더 스코어를 의미  \w는 [A-Za-z]와 같음 

 \W는 알파벳, 숫자, 언더 스코어가 아닌 문자를 의미 

 

31.5.5 NOT 검색

- [...]내의 ^는 not의 의미를 가짐 

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

//숫자를 제외한 문자열을 전역 검색
const regExp = /[^0-9]+/g;

target.match(regExp);
//[ ' AA B BB ', ' Aa Bb' ]

31.5.6 시작 위치로 검색

- [...] 밖의 ^는 문자열의 시작을 의미 

const target = 'https://poiemaweb.com';

//'https'로 시작하는지 검색
const regExp = /^https/;

regExp.test(target); //true

31.5.7 마지막 위치로 검색 

- $는 문자열의 마지막을 의미 

const target = 'https://poiemaweb.com';

//'com'으로 끝나는지 검색 
const regExp = /com$/;

regExp.test(target); //true

'JavaScript' 카테고리의 다른 글

[Deep dive] 33장 7번째 데이터 타입 Symbol  (0) 2023.08.17
[Deep dive] 32장 String  (0) 2023.08.17
[Deep dive] 30장 Date  (0) 2023.08.17
[Deep dive] 29장 Math  (0) 2023.08.17
[Deep dive] 28장 Number  (0) 2023.08.17