Given description,
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 "*"으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
Given condition,
phone_number는 길이 4 이상, 20이하인 문자열입니다.
주어진 코드의 의미를 파악해보자
function solution(phone_number) {
var answer = '';
return answer;
}
// 핸드폰 번호를 주면 원하는 요청사항을 반영하고 answer로 반환해라
// 핸드폰 번호의 길이는 바뀔 수 있으니, 주의할 것
나의 풀이
function solution(phone_number) {
var answer = "";
/*
- 문자를 *로 바꾸는 방법은 ?
- 모든 숫자 *로 치환하는 방법은 replace 라는 메서드를 사용
- 맨 뒤에서 4자리를 어떻게 따로 빼지 ??
- 일단 잘라 낸 다음에 replace 이후에 붙여 ??
- 자르는 방법은 ?? substr(startIndex, endIndex) 를 쓰면 ??
- ok 그럼 맨뒤에서부터 자를 수 있어 ?
- startIndex 에 -를 붙이면 가능!!
*/
let input = phone_number;
let last = input.substr(-4, 4);
/*
input 받은 값을 맨뒤에서 4자리 잘라주고 반환하여 맨뒤 4자리 보존
*/
let front = input.slice(0, -4);
// 받은 값에서 맨뒤 4자리 제외
let star = front.replace(/[0-9]/gi, "*");
// 맨뒤 4자리가 제외된 모든 숫자를 *로 바꿔줘
answer = star + last;
// 둘이 합해서 반환
return answer;
}
// 필요했던 메서드를 이해해보자
-----------------------------------------------------------
// 먼저 replace!! replace는
// 특정문자를 원하는 문자로 바꿔준다고 한다.
// 대신 가장 먼저 찾은 매치되는 값만!!!
let str = "Hello world, Hello all, Hello ladys and gentlemans";
str = str.replace("Hello", "Good morning");
console.log(str);
// Good morning world, Hello all, Hello ladys and gentlemans
// 만약 동일한 모든 값을 변경하고 싶다면? : 정규 표현식 소환
let str = "Hello world, Hello all, Hello ladys and gentlemans";
str = str.replace(/hello/gi, "Good morning");
console.log(str);
// Good morning world, Good morning all, Good morning ladys and gentlemans
// 보시다시피 대소문자 상관없이 교체되는 것을 확인 할 수 있음
/*
그러나, 이번에 내가 해야할건 모든 숫자를 *로 바꿔주는것.
그렇다면 특정 문자가아닌 모든 수가 타겟이 되어야 한다. 이때 사용하는게
패턴 "/[0-9]/gi" 이다. 대괄호안에 있는 범위의 숫자를 모두 의미한다.
이런게 정규 표현식이라고 한다.*/
let str = "okn13402dnsafko19234u9235ndsanfi130314sdkflna0134108saknf";
str = str.replace(/[0-9]/gi, "");
console.log(str); // okndnsafkoundsanfisdkflnasaknf
// 0부터 9까지의 숫자를 모두 없애버렷
다른사람들의 풀이
function hide_numbers(s) {
return s.replace(/\d(?=\d{4})/g, "*");
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));
/*
같은 replace 를 사용했지만,
정규 표현식에서 마지막 4자리를 그냥 놔두는 방식을 채택한듯
*/
다른사람의 풀이를 이해하기 위해선 아래의 내용도 확인해야함
=> 코드를 풀어서 설명하면,
return s.replace(/\d(?=\d{4})/g, "*");
\d{4} 4자리의 숫자를 follwed 하는 숫자들 모두 로 replace 해라
== 맨 마지막 4자리르 제외하고 앞에 숫자를 모두 로 replace 해라
미쳤네ㅋ
다른 풀이 (나랑 접근방식이 비슷했지만 초깔끔)
function hide_numbers(s){
var result = "*".repeat(s.length - 4) + s.slice(-4);
/*
*을 반복하는데 문자열의 맨뒤에서 4자리 까지만 +
맨마지막 4자리르 잘라
result에 할당하고 result를 반환
*/
return result;
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));
정규 표현식이란, "특정 패턴의 문자열"을 찾기 위한 표현 방식이다.
(이런걸 형식언어, formal language 라고 한다.)
e.g. angry person 010-1234-5678. please call him later
\d는 숫자를 의미하고, {}안의 숫자는 갯수를 의미한다.
/a/ : 문자 "a" "하나"만 찾는다
"a"ngry person 010-1234-5678. please call him later
/a/g : 문자 "a" "모두" 찾는다 "
"a"ngry person 010-1234-5678. ple"a"se c"a"ll him l"a"ter
/[ah0]/g : "a","h",0 중에 하나를 모두 찾는다.
"a"ngry person "0"1"0"-1234-5678. ple"a"se c"a"ll "h"im l"a"ter
/[0-9]/g : 숫자 0~9까지 모두 찾는다.
angry person 010-1234-5678. please call him later
[a-zA-Z]/g : 영어알파벳 대소문자 모두 찾는다.
angry person 010-1234-5678. please call him later
/[^5-9]g : 숫자 5~9가 아닌 것을 모두 찾는다.
angry person 010-1234-"5678". please call him later
사용되는 패턴을 알아보자
패턴 | 의미 |
---|---|
a-zA-Z | 영어알파벳(-으로 범위를 지정) |
ㄱ-ㅎ가-힣 | 한글문자(-으로 범위를 지정) |
0-9 | 숫자(-으로 범위를 지정) |
. | 모든 문자열(숫자, 한글, 영어, 특수기호, 공백, 모두! 단, 줄바꿈 x) |
\d | 숫자 |
\D | 숫자가 아닌것 |
\w | 영어 알파벳, 숫자, 언더스코어( _ ) |
\W | \w가 아닌 것 |
\s | space 공백 |
\S | space 공백이 아닌것 |
\특수기호 | 특수기호 |
사용되는 기호를 알아보자
기호 | 의미 |
---|---|
[ ] | 괄호안의 문자들 중 하나 |
[^문자] | 괄호안의 문자를 제외한 것 |
^문자열 | 특정 문자열로 시작(괄호없음 주의!) |
문자열$ | 특정문자열로 끝남 |
( ) | 그룹 검색 및 분류(match메서드에서 그룹별로 묶어줌) |
(?:패턴) | 그룹검색(분류x) |
\b | 단어의 처음/끝 |
\B | 단어의 처음/끝이 아님 |
? | 최대한번(없거나 한개) |
* | 없거나 있거나: 여러개 포함 |
+ | 최소 한개(한개 또는 여러개) |
{n} | n개 |
{Min,} | 최소 Min개 이상 |
{Min, Max} | 최소 Min개 이상, 최대 Max개 이하 |
사용되는 플래그를 알아보자
플래그 | 의미 |
---|---|
g | Global : 모든 문자 검색(안쓰면 매칭되는 첫 문자만 검색) |
i | Ignore Case : 대소문자 구분 안함 |
m | multi line : 여러 행의 문자열에 대해 검색 |
사용되는 메서드에 대해서 알아보자
메서드 | 의미 |
---|---|
("문자열").match(/정규표현식/플래그) | "문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환 |
("문자열").replace(/정규표현식/,"대체문자열") | "정규표현식"에 매칭되는 항목을 "대체문자열"로 반환 |
("문자열").split(정규표현식) | "문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환 |
(정규표현식).test("문자열") | "문자열"이 "정규표현식"과 매칭되면 true, 아니면 false 반환 |
(정규표현식).exec("문자열") | match 메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환) |
정규 표현식 예제
let text =
"대나무 빨래 구입 문의 : http://dongumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com";
text = text.match(/https?:\/\/[\w\-\.]+/g);
/*
http로 시작하고 s가 있거나 없거나, : 나오고 /이게 2번 나오고
w(문자),-(하이픈),.(점) 으로 이루어진
문자열이 한개이상(+)인걸 전부 찾아라(g)
*/
console.log(text);
// [ 'http://dongumaster.com', 'http://google.com' ]
let text =
"대나무 빨래 구입 문의 : http://dongumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com";
text = text.match(/\d{2,3}-\d{3,4}-\d{4}/g);
/*
2자리이거나 3자리인 숫자 다음 -
3자리 이거나 4자리인 숫자 다음 -
4자리인 숫자 를
전부 찾아라(g)
*/
console.log(text);
resoucre : https://curryyou.tistory.com/234