[알고리즘실수] match와 regexp 사용 실수 정리

김종현·2024년 11월 6일
0

알고리즘

목록 보기
2/8
post-thumbnail

문제

실수

코드 및 접근 방식

function solution(string){
    const pp = string.match(/p/gi).length
    const yy = string.match(/y/gi).length
    
    return pp <1 && yy <1 ? true : pp === yy ? true : false
}
  • match 메서드를 이용해 조건에 부합하는 각 배열의 길이를 비교하여 결과 반환 시도.

문제 발생 이유

match 메서드는 null을 반환할 수 있다.'p' 또는 'y'가 전혀 없을 경우 match는 null을 반환하므로, null.length를 호출하려고 하면 에러가 발생하므로 pp나 yy 변수가 에러를 일으키는 상황이 생긴다.

개선

코드 및 개선 방식

function solution(string) {
    const pp = (string.match(/p/gi) || []).length;
    const yy = (string.match(/y/gi) || []).length;

    return pp === yy;
}
  • null 값이 나올 경우 빈 배열을 반환하여 length 도출이 가능.
  • p 혹은 y가 전혀 없는 조건은 바꿔 말해 두 조건이 동일한 경우를 의미. 따라서 pp === yy로 개선.

학습 사항 정리

1. String.prototype.match()

  • 문자열이 정규식과 매치되는 부분을 검색.
  • 정규식 개체를 매개변수로 받고 RegExp가 아닌 객체 obj가 전달되면, new RegExp(obj)를 사용하여 암묵적으로 RegExp로 변환.
  • 매개변수를 전달하지 않고 match()를 사용하면, 빈 문자열:[""]이 있는 Array가 반환.
  • 정규식에 g 플래그가 포함되어 있으면 객체가 아닌 일치하는 하위 문자열을 포함하는 Array를 반환.
  • 캡처된 그룹은 반환 X, 일치하는 것이 없으면 null이 반환.

2. 정규 표현식

쓰이는 플래그 정리

  • 플래그는 정규식과 완전히 합쳐지므로 나중에 추가하거나 제거할 수 없음.
// 표현식의 사용
const reg = /pattern/flags;

const regInstance = new RegExp("pattern", "flags");

// 예제
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const regexp = /[A-E]/gi;
const matches_array = str.match(regexp);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
profile
고양이 릴스 매니아

0개의 댓글