정규표현식( regular expression)

zaman·2022년 3월 3일
0

Theories

목록 보기
4/5
post-thumbnail

MDN 정규표현식

정규 표현식(RegExp)

일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어
자바스크립트의 고유 문법이 아니며, 대부분의 프로그래밍 언어와 코드 에디터에 내장돼 있음
  • 문자열을 대상으로 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있는 기능 즉, 패턴 매칭 기능을 제공함
  • 정규표현식을 사용하면 반복문이나 조건문 없이 패턴을 정의할 수 있지만 주석이나 공백을 허용하지 않고 여러 가지 기호를 혼합해 사용하기 때문에 가독성이 안좋음
  • exec 메소드와 test 메소드 그리고 String의 match메소드, replace메소드, search메소드, split 메소드 등과 함께 사용


1. 정규 표현식 생성

: 정규 표현식 리터럴과 RegExp 생성자 함수를 사용해 생성할 수 있음

/RegExp/i

/ 👉 시작과 종료
RegExp 👉 패턴
i 👉 플래그

예를들어

const example = 'is this all there is?';
const regexp = /is/i; // 패턴: is, 플래그: i(대소문자 구문 x)
regexp.test(example); // true

const reg = new RegExp(/is/i); 
reg.test(example); // true


2. 플래그

: 정규 표현식의 검색 방식을 설정하기 위해 사용
순서와 상관없이 하나 이상의 플래그를 동시에 설정할 수 있음

FlagDescription
g전역 검색
i대소문자 구분 없는 검색
m다중행(multi-line) 검색
s.에 개행 문자도 매칭(ES2018)
u유니코드; 패턴을 유니코드 코드 포인트의 나열로 취급합니다.
y"sticky" 검색을 수행. 문자열의 현재 위치부터 검색을 수행합니다. sticky (en-US) 문서를 확인하세요.

출처: mdn

자주 사용하는 플래그
i (ignore case) : 대소문자를 구분하지 않고 패턴을 검색
g (global) : 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색
m (multi line): 문자열의 행이 바뀌더라도 계속 패턴을 검색



3. 정규 표현식의 메서드

자주 사용하는 메서드

1. RegExp.prototype.exec()

:exec() 메서드는 주어진 문자열에서 일치 탐색을 수행한 결과를 배열로 반환
매칭 결과가 없으면 null을 반환

예) 출처: js deep dive

const example = "is this all there is?";
const regexp = /is/;

console.log(regexp.exec(example));
// [ 'is', index: 0, input: 'is this all there is?', groups: undefined ]

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

예) 출처: mdn

const regex1 = RegExp('foo*', 'g');
const str1 = 'table football, foosball';
let array1;

while ((array1 = regex1.exec(str1)) !== null) {
  console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
  // "Found foo. Next starts at 9."
  // "Found foo. Next starts at 19."
}

2. RegExp.prototype.test()

:test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환

예) 출처: js deep dive

const example = "is this all there is?";
const regexp = /is/;

console.log(regexp.test(example)); //true

예) 출처: mdn

const str = "table football";

const regex = new RegExp("foo*");
const globalRegex = new RegExp("foo*", "g");

console.log(regex.test(str)); // true
console.log(globalRegex.lastIndex); // 0
console.log(globalRegex.test(str)); // true
console.log(globalRegex.lastIndex); // 9
console.log(globalRegex.test(str)); // false

✔️ 전역 플래그와 test()

: 정규 표현식에 전역 플래그를 설정한 경우, test() 메서드는 정규 표현식의 lastIndex (en-US)를 업데이트합니다.
(RegExp.prototype.exec()도 lastIndex 속성을 업데이트합니다.)

test(str)을 또 호출하면 str 검색을 lastIndex부터 계속 진행합니다. lastIndex 속성은 매 번 test()가 true를 반환할 때마다 증가하게 됩니다.

👉 이 성질 때문에
console.log(globalRegex.lastIndex); // 9
console.log(globalRegex.test(str)); // false
이렇게 반환된 것!

참고: test()가 true를 반환하기만 하면 lastIndex는 초기화되지 않습니다. 심지어 이전과 다른 문자열을 매개변수로 제공해도 그렇습니다!

test()가 false를 반환할 땐 lastIndex 속성이 0으로 초기화됩니다.

3. String.prototype.match()

: match() 메서드는 문자열이 정규식과 매치되는 부분을 검색

예) 출처: js deep dive

const example = "is this all there is?";
const regexp = /is/;

console.log(example.match(regexp)); 
// [ 'is', index: 0, input: 'is this all there is?', groups: undefined ]
const example = "is this all there is?";
const regexp = /is/g;

console.log(example.match(regexp));
// [ 'is', 'is', 'is' ]
  • exec 메서드는 문자열 내의 모든 패턴을 검색하는 g 플래그를 지정해도 첫 번째 매칭 결과만 반환함
  • match는 g 플래그를 지정하면 모든 매칭 결과를 배열로 반환

profile
개발자로 성장하기 위한 아카이브 😎

0개의 댓글