연습이 필요할 땐?
https://rubular.com/
https://regexone.com/

.+ -> 한 개 이상의 문자열, (...) -> 캡처
//new RegExp(표현식)
const regexp1 = new RegExp("^\d+");
//new RegExp(표현식,플래그)
const regexp2 = new RegExp("^\d+","gi");
//리터럴 방식
// /표현식/
const regexp1 = /^\d+/;
// /표현식/플래그
const regexp2 = /^\d+/gi;
const message = "안녕하세요. 010-1234-5678로 전화주세요!"
const message1 = "안녕하세요. 반갑습니다."
const regExp = /\d{3}-\d{4}-\d{4}/;
console.log(regExp.test(message)); //true
console.log(regExp.test(message1)); //false
const message = "안녕하세요. 010-1234-5678로 전화주세요!"
const message1 = "안녕하세요. 반갑습니다."
const regExp = /\d{3}-\d{4}-\d{4}/;
console.log(regExp.exec(message));
console.log(regExp.exec(message1));

matchAll은 매칭된 모든 케이스를 반환const message = "안녕하세요. 010-1234-5678로 전화주세요!"
const message1 = "안녕하세요. 반갑습니다."
const regExp = /\d{3}-\d{4}-\d{4}/;
console.log(message.match(regExp));
console.log(message1.match(regExp));

const message = "안녕하세요. 010-1234-5678로 전화주세요!"
const message1 = "안녕하세요. 010-1234-5678말고 010-7890-4561로 전화주세요!";
const regExp = /\d{3}-\d{4}-\d{4}/;
console.log(message.replace(regExp,"전화번호"));
console.log(message1.replace(regExp,"전화번호"));
//모두 바꾸기
console.log(message1.replace(/\d{3}-\d{4}-\d{4}/g,"전화번호"));
//안녕하세요. 전화번호로 전화주세요!
//안녕하세요. 전화번호말고 010-7890-4561로 전화주세요!
//안녕하세요. 전화번호말고 전화번호로 전화주세요!
(무조건 처음)위치를 반환한다. (문자 검색)
\1로 첫번째 캡처를 이용하겠다는 뜻const raw = "AAAAAABBBDFFFFFFFKK"
const compressed = "6A3B1D7F2K";
const regExp = /(.)\1*/g;
const result = raw
.match(regExp)
.reduce((a,b) => a + `${b.length}${b.slice(0,1)}`,"");
console.log(result); //6A3B1D7F2K
console.log(result === compressed); //true
function ant(n){
let answer = '1';
// \1*은 캡처된 문자와 동일한 문자들의 반복을 의미
let regexp = /(.)\1*/g;
for(let i=1; i<n; i++){
let result = answer
.match(regexp)
.reduce((acc,cur)=> acc + `${cur.length}${cur.slice(0,1)}`,"");
answer = result;
}
return answer;
}
지금은? 서버/클라이언트 간 인증은 별도 토큰(JWT)을 사용하고 쿠키는 클라이언트 자체적인 지속적 데이터 관리 용도로 사용된다.
IndexedDB는 파일이나 블롭 등 많은 양의 구조화된 데이터를 클라이언트에 저장하기 위한 로우 레벨 API
localStorage, cookies, indexedDB가 존재한다.JSON.parse(), JSON.stringfy()가 꼭 필요하다.const indexDB = window.indexedDB
if(!indexDB) window.alert('해당 브라우저에서는 indexedDB를 제공하지 않습니다')
else{
const request = indexDB.open('testDB')
request.onerror = (event) => alert('실패했습니다.')
request.onsuccess = (event) => this.result
}

keyPath를 정의createObjectStore를 사용해 생성한다.onupgradeneeded 이벤트와 함께 사용const indexDB = window.indexedDB
if (!indexDB) window.alert('해당 브라우저에서는 indexedDB를 제공하지 않습니다')
else {
let db;
const request = indexDB.open('testDB')
// ObjectStore를 만들거나 수정할때 이 이벤트내에서 진행함
request.onupgradeneeded = (e) =>{
db = e.target.result;
let objectStore = db.createObjectStore("username", {keyPath : "id"})
}
request.onerror = (e) => alert('실패했습니다.')
request.onsuccess = (e) => db = request.result
}
