문자열을 다루는데 있어서 정규 표현식이 얼마나 강력한 힘을 가지고 있는지
[프로그래머스 - 신규 아이디 추천] 문제를 풀면서 느끼게 되었다.
(레벨 1인데 정규 표현식을 모르면 난이도가 배가 된다)
따라서, 이번에는 정규 표현식에 대해 정리해 볼 생각이다.
일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어
정규 표현식은 패턴과 플래그로 구성되는데,
패턴
은 문자열의 일정한 규칙을 표현하기 위해 사용되며,
플래그
는 검색 방식을 설정하기 위해 사용한다.
정규 표현식은 //
로 감싸서 표현하며
//
뒤에 들어가는 것들을 플래그라 하며,
//
안에 들어가는 것들은 패턴이라 한다.
const sentence = 'I study as hard as possible.';
/as/.exec(sentence);
정규 표현식의 패턴을 검색해 인수로 전달받은 문자열과의 매칭 결과를 배열로 반환한다.(첫 번째 매칭 결과만 반환)
/as/.test(sentence); // return true
exec()와 비슷하지만, 매칭 결과를 true
, false
로만 반환해준다.
sentence.match(/as/g);
exec()와 비슷한 기능을 가지고 있지만, 패턴이 일치하는 한 모든 매칭 결과를 배열로 반환한다는 특징이 있다.
정규 표현식의 검색 방법을 설정하기 위해 사용
i
: 대소문자 구분 xg
: 모든 문자열을 전역 검색m
: 문자열의 행이 바뀌어도 검색 진행.
: 임의의 문자 한 개{a,b}
: 최소 a, 최대 b번 반복 가능{a}
: a번 반복 가능{a,}
: 최소 a번 이상 반복됨+
: {1,}
과 동일?
: {0,}
과 동일|
: or 검색[]
: []
내의 모든 문자는 or로 동작\d
: [0-9]
= 숫자 나타냄\w
: [A-Za-z0-9_]
= 알파벳, 숫자, 언더스코어 나타냄[^]
: not 의미\D
: not \d
\W
: not \w
^
: 문자열의 시작 의미([]
내부의 ^와는 완전 다르다.)$
: 문자열의 끝 의미https://programmers.co.kr/learn/courses/30/lessons/72410
new_id = new_id.toLowerCase();
new_id = new_id.replace(/[^\w-_.]/g,'');
new_id = new_id.replace(/\.+/g,'.');
new_id = new_id.replace(/^\.|\.$/,'');
new_id = new_id.replace(/^$/,'a');
new_id = new_id.substr(0,15).replace(/\.$/,'');
while(new_id.length<=2){
new_id = new_id + new_id[new_id.length-1]
}
function solution(new_id) {
//step 1
new_id = new_id.toLowerCase()
//step 2
new_id = new_id.replace(/[^\w-_.]/g,'')
//step 3
new_id = new_id.replace(/\.+/g, '.')
//step 4
new_id = new_id.replace(/^\.|\.$/,'')
//step 5
new_id = new_id.replace(/^$/,'a')
//step 6
new_id = new_id.substr(0,15).replace(/\.$/,'')
//step 7
while(new_id.length<=2){
new_id = new_id + new_id[new_id.length-1]
}
/*
new id = new_id.replace(/^(.)$/, '$1$1$1').replace(/^(.)(.)$/, '$1$2$2');
*/
//console.log(new_id)
return new_id;
}