티스토리 뷰
기본 문법
str 문자열의 pattern 부분을 replacement로 교체한 새로운 문자열을 리턴한다. (기존 str 문자열을 변경시키지 않음)
pattern인자로 문자열이 들어온 경우는 제일 처음 매치하는 패턴 1개만 교체됨.
flag가 g (global)인 RegExp가 들어온 경우에는 매치하는 모든 패턴이 교체됨.
문제
LeetCode 394번 Decode String 문제를 풀면서 replace 함수 사용법을 알아보자.
The encoding rule is: k[encoded_string]k [encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times.
입력 내부의 모든 k [encoded_string] 형태를 encoded_string이 K번 반복되는 형태의 문자열로 풀어라.
재귀적으로 다 풀어야 함.
replace 함수 예제
let str = "3[a]2[b]";
let newStr = str.replace(/(?<num>\d+)\[(?<str>\w+)\]/g, (match, p1, p2, offset, string, groups) => {
console.log("\n====");
console.log("match", match);
console.log("p1",p1,"p2",p2);
console.log("offset",offset);
console.log("string",string);
console.log("groups",groups); //captures named group. undefined if not matched.
return p2.repeat(p1);});
console.log("\noriginal",str, " new_string", newStr);
(1) RegExp
( ) 괄호로 감싸면 그룹이다. 그룹에 이름 주고 싶으면 (? <그룹명> 표현식 ) 형태로 쓰면 된다.
위 예제에서의 정규표현식은 가장 안쪽 패턴에 매칭 된다.
/w는 [a-zA-Z0-9_]와 동일하므로 "[" 나 "]"는 포함하지 않기 때문.
(2) function
groups의 경우는 이름 붙은 그룹만 포함한다. 그런 게 없을 경우 undefined.
정규표현식과 replace함수를 이용한 문제 해결 코드
let decodeString = function(s) {
let re = /(\d+)\[(\w+)\]/g;
while(re.test(s)){
s = s.replace(re, (_, num, str) => str.repeat(num));
}
return s;
};
문제 링크 : https://leetcode.com/problems/decode-string/
출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
'시리즈 > Javascript' 카테고리의 다른 글
정규표현식 예제 (0) | 2021.02.20 |
---|---|
Map and Set (0) | 2021.02.20 |
javascript 팁 (0) | 2021.01.21 |
javascript 콘솔 입출력 (0) | 2021.01.21 |
[queue] javascript 효율적인 큐 (0) | 2021.01.13 |