정규표현식
특정힌 규칙을 가진 문자열 집합을 표현하는데 사용하는 언어
📍 정규 표현식 참고 사이트
📍 정규 표현식 객체 생성 방법
1) const regExp = new RegExp("정규표현식");
2) const regExp = /정규표현식/;
-> 양쪽 '/' 기호 정규 표현식의 리터럴 표기법
📍 문자열 패턴 확인 메소드(함수)
1) regExp.test(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우 true. 없으면 false
2) regExp.exec(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우
처음에 매칭되는 문자열 반환, 없으면 null 반환
📍 정규 표현식 메타 문자
a (일반 문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
[abcd] : 문자열 내에 a,b,c,d 중에 하나라도 일치하는 문자가 있는지 검색
^(캐럿) : 문자열의 시작을 의미
$(달러) : 문자열의 끝을 의미
\w(word, 단어) : 아무 글자(단, 띄어쓰기, 특수문자, 한글X)
\d (digit, 숫자) : 아무 숫자(0~9 중 하나)
\s (space, 공간) : 아무 공백 문자(띄어쓰기, 엔터, 탭 등)
[0-9] : 0부터 9까지 모든 숫자
[ㄱ-힣] : ㄱ부터 힣까지 모든 한글
[a-z] : 모든 영어 소문자
[A-Z] : 모든 영어 대문자
a{5} : a 문자가 5개 존재 == aaaaa
a{2,5} : a가 2개 이상 5개 이하 == aa, aaa, aaaa, aaaaa
a{2,} : a가 2개 이상
? : 0개 또는 1개
. : 1칸 (개행문자를 제외한 문자 하나)
문자열, 숫자, 형변환, 연산자
📍 문자열(String) 내장 객체
자바스크립트에는 문자열을 나타내는 객체(String)이 존재하며 문자열과 관련된 기본적인 함수를 제공해준다.
📍 숫자(Math 내장 객체)
숫자(number) 타입 리터럴 표기법 : 12(정수), 3.14(실수), Infinity(무한), NaN(Not a Number)
📍 비교 연산자
🔑 CF.
배열
변수를 묶음으로 다루는 것(변수가 연속적으로 나열됨)
JS 변수 : 값이 저장되기 전까지 자료형 지정되지 않음
📍 배열 관련 함수
push(): 배열의 마지막 요소로 추가
pop(): 배열의 마지막 요소 꺼내옴
배열.indexOf("값") : 일치하는 값을 가진 요소의 index를 반환(없으면 -1 반환)
배열.sort([정렬기준 함수]) : 배열 내 요소를 오름차순 정렬(문자열 기준)
단, [정렬기준 함수]가 작성되면 정렬결과가 달라진다.
배열.toString() : 배열 요소를 하나의 문자열로 출력-> 요소 사이에 "," 추가
배열.join("구분자") : 배열 요소를 하나의 문자열로 출력 -> 요소 사이에 "구분자" 추가
📍 배열 선언 방법
const arr1 = new Array(n);
: n이 빈자리면 비어있는 배열const arr = [];
📍 for문으로 반복 접근
for( 변수 of 배열 )
🔑 CF.
function(a,b) { return a-b }
사용<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>07_정규표현식</title>
<style>
.area{
width: 500px;
min-height: 300px; /* 최소 300px, 내용이 높이를 초과하면 자동으로 늘어남 */
border: 1px solid black;
}
.confirm{ color: green;}
.error{ color: red;}
</style>
</head>
<body>
<h1>정규 표현식(Regular Expression)</h1>
<pre>
특정한 규칙을 가진 문자열 집합을 표현하는데 사용하는 형식 언어
정규 표현식을 이용하면
입력된 문자열에 대한 특정 조건 검색, 일치 여부 판단, 치환에 대한
조건문을 간단히 처리할 수 있다.
</pre>
<h3>정규 표현식 참고 사이트</h3>
<ul>
<li><a href="https://regexper.com/" target="_blank">작성한 정규표현식을 그림으로 나타내주는 사이트</a></li>
<li><a href="https://regexr.com/" target="_blank">정규표현식 테스트 사이트</a></li>
<li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D"
target="_blank">
MDN - 정규표현식 설명
</a></li>
</ul>
<hr>
<h1>정규 표현식 객체 생성 및 확인하기</h1>
<pre>
1. 정규 표현식 객체 생성 방법
1) const regExp = new RegExp("정규표현식");
2) const regExp = /정규표현식/;
-> 양쪽 '/' 기호 정규 표현식의 리터럴 표기법
2. 문자열 패턴 확인 메소드(함수)
1) regExp.test(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우 true. 없으면 false
2) regExp.exec(문자열)
-> 문자열에 정규표현식과 일치하는 패턴이 있을 경우
처음에 매칭되는 문자열 반환
없으면 null 반환
</pre>
<button id="check1">확인하기</button>
<hr>
<h1>정규 표현식의 메타 문자</h1>
<pre>
문자열의 패턴을 나타내는 문자열
문자마다 지정된 특별한 뜻이 담겨있다.
a (일반 문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
[abcd] : 문자열 내에 a,b,c,d 중에 하나라도 일치하는 문자가 있는지 검색
^(캐럿) : 문자열의 시작을 의미
$(달러) : 문자열의 끝을 의미
\w(word, 단어) : 아무 글자(단, 띄어쓰기, 특수문자, 한글X)
\d (digit, 숫자) : 아무 숫자(0~9 중 하나)
\s (space, 공간) : 아무 공백 문자(띄어쓰기, 엔터, 탭 등)
[0-9] : 0부터 9까지 모든 숫자
[ㄱ-힣] : ㄱ부터 힣까지 모든 한글
[a-z] : 모든 영어 소문자
[A-Z] : 모든 영어 대문자
* 특수문자의 경우 각각을 입력하는 방법밖엔 없음
단, 메타문자와 중복되는 특수문자는
앞에 \(백슬래시)를 추가하여 탈출 문자(Escape)로 만들어 사용
* 수량 관련 메타 문자
a{5} : a 문자가 5개 존재 == aaaaa
a{2,5} : a가 2개 이상 5개 이하 == aa, aaa, aaaa, aaaaa
a{2,} : a가 2개 이상
* : 0개 이상 == 0번 이상 반복 == 있어도 되고, 없어도 되고
+ : 1개 이상 == 1번 이상 반복
? : 0개 또는 1개
. : 1칸 (개행문자를 제외한 문자 하나)
</pre>
<button id="btn1">확인하기</button>
<div id="div1" class="area"></div>
<hr>
<h3>이름 유효성 검사</h3>
<h5>한글 2~5글자</h5>
이름: <input type="text" id="inputName"> <br>
<span id="inputNameResult"></span>
<hr>
<h3>주민등록번호 유효성 검사</h3>
주민등록번호 : <input type="text" id="inputPno"> <br>
<span id="inputPnoResult">주민등록번호를 작성해주세요.</span>
<script src="JS/07_정규표현식.js"></script>
</body>
</html>
// 정규 표현식 객체 생성 + 확인하기
document.getElementById("check1").addEventListener("click", function(){
// 정규 표현식 객체 생성
const regExp1 = new RegExp("script");
// script와 일치하는 문자열이 있는지 검사하는 정규 표현식
const regExp2 = /java/;
// 문자열 'java'와 일치하는 문자열이 있는지 검사하는 정규 표현식
// 확인하기
const str1 = "저희는 지금 javascript를 공부하고 있습니다.";
const str2 = "servlet/jsp(java server page)도 조만간 합니다.";
const str3 = "java, java, java";
console.log("regExp1.test(str1): " + regExp1.test(str1)); // true (str1 안에 script라는 문자가 있음)
console.log(regExp1.exec(str1));
console.log("regExp2.test(str2): " + regExp2.test(str2));
console.log(regExp2.exec(str2));
// 일치하는 게 없는 경우
console.log("regExp1.test(str2): " + regExp1.test(str2));
console.log(regExp1.exec(str2));
// 일치하는 게 여러 개 있을 경우
console.log("regExp2.test(str3): " + regExp2.test(str3));
console.log(regExp2.exec(str3));
})
document.getElementById("btn1").addEventListener("click", function(){
const div1 = document.getElementById("div1");
div1.innerHTML=""; //문자 삭제 (div 초기화)
// a(일반문자열) : 문자열 내에 a라는 문자열이 존재하는지 검색
const regExp1 = /a/;
div1.innerHTML += "/a/ , apple : " + regExp1.test("apple") + "<hr>"; // true
div1.innerHTML += "/a/ , price : " + regExp1.test("price") + "<hr>"; // false
// [abcd] : 문자열 내에 a,b,c,d 중 하나라도 일치하는 문자가 있는지 검색
const regExp2 = /[abcd]/;
div1.innerHTML += "/[abcd]/ , price : " + regExp2.test("apple") + "<hr>"; // true
div1.innerHTML += "/[abcd]/ , sub : " + regExp2.test("sub") + "<hr>"; // true
div1.innerHTML += "/[abcd]/ , qwert : " + regExp2.test("qwert") + "<hr>"; // false
// ^(캐럿) : 문자열의 시작 의미
const regExp3 = /^group/; // 문자열의 시작이 "group"인지 확인
div1.innerHTML += "/^group/ , group100 : " + regExp3.test("group100") + "<hr>"; // true
div1.innerHTML += "/^group/ , 100group : " + regExp3.test("100group") + "<hr>"; // false
// $(달러) : 문자열의 끝을 의미
const regExp4 = /group$/; // 문자열의 끝이 group 인자 확인
div1.innerHTML += "/group$/, group100 : " + regExp4.test("group100") + "<hr>"; // false
div1.innerHTML += "/group$/, 100group : " + regExp4.test("100group") + "<hr>"; // true
})
// 이름 유효성 검사
document.getElementById("inputName").addEventListener("keyup", function(){
// 결과 출력용 span
const span = document.getElementById('inputNameResult');
// 한글 2~5글자 정규 표현식(정규식)
// [가-힣] : 한글(단일 자음, 모음 제외)
const regExp = /^[가-힣]{2,5}$/;
// 유효성 검사
if(regExp.test(this.value)){
// #inputName에 작성된 값이 유효한 경우
span.innerHTML="유효한 이름 형식입니다.";
span.style.color="green";
span.style.fontWeight="bold";
} else {
span.innerHTML="이름 형식이 유효하지 않습니다.";
span.style.color="red";
span.style.fontWeight="bold";
}
// 빈칸인지 검사
// 빈칸이라면 span에 작성된 내용 초기화(삭제)
// (-> 이름을 쓰고 지웠을 때처럼 보여야 함)
/* if(this.value == ""){
span.innerHTML="";
} */
if(this.value.length == 0){
span.innerHTML="";
}
// 주민등록번호 유효성 검사
// 주민등록번호 정규식 검사
// 생년월일(6)-고유번호(7)
})
/* 이메일 유효성 검사, 비번 유휴성 검사 해보기 */
document.getElementById("inputPno").addEventListener("keyup", function(){
const span = document.getElementById("inputPnoResult");
/* const regExp = /^\d{6}\-[0-9]{7}$/; */
// 연도(2) 월(2) 일(2)
// 업그레이드
const regExp = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])\-[1-4]\d{6}$/;
/* 띄어쓰기 하지 마세요 */
// () : 포획 괄호, 괄호 내부에서 대응되는 부분을 찾아 기억함
// | : 또는
// 월
// 01 ~ 09 -> /0[1-9]/
// 10 ~ 12 -> /1[0-2]/
// (0[1-9]|1[0-2]) : 괄호 내 | 기호를 기준으로 구분되며
// 0이 먼저 입력된 경우 다음 자리는 1~9
// 1이 먼저 입력된 경우 다음 자리는 0~2
// 일
// 01~09 -> 0[1-9]
// 10~19 -> 1[0-9]
// 20~29 -> 2[0-9]
// 30~31 -> 3[0-1]
// (0[1-9]|1[0-9]|2[0-9]|3[0-1])
// 요소.classList : 요소가 가지고 있는 클래스를 배열로 반환
// 요소.classList.remove("클래스명") : 요소의 특정 클래스 제거
// 요소.classList.add("클래스명") : 요소의 특정 클래스 추가
// 요소.classList.toggle("클래스명") : 클래스가 있으면 제거, 없으면 추가
// 유효성 검사
if(regExp.test(this.value)){
span.innerText="유효한 주민등록번호 형식입니다.";
span.classList.remove("error"); // error 클래스 제거
span.classList.add("confirm"); // confirm 클래스 추가
} else {
span.innerText="유효하지 않은 형식입니다.";
span.classList.remove("confirm"); // confirm 클래스 제거
span.classList.toggle("error"); // error 클래스 추가
}
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>08_문자열, 숫자, 형변환, 연산자</title>
</head>
<body>
<h2>문자열(String 내장 객체)</h2>
<pre>
자바스크립트에는 문자열을 나타내는 객체(String)이 존재하며
문자열과 관련된 기본적인 함수를 제공해준다.
</pre>
<button id="btn1">문자열 관련 함수(콘솔 확인)</button>
<hr>
<h2>숫자(Math 내장 객체)</h2>
<pre>
숫자(number) 타입 리터럴 표기법 :
12(정수), 3.14(실수), Infinity(무한), NaN(Not a Number)
Math : 숫자 관련 함수를 제공하는 JS 내장 객체
ex) Math.random() : 난수
</pre>
<button id="btn2">숫자 관련 함수(콘솔 확인)</button>
<hr>
<h2>문자열 -> 숫자 형변환</h2>
<pre>
paseInt(문자열) : 정수로만 변환 가능
parseFloat(문자열) : "정수" -> 정수 , "실수" -> 실수
Number(문자열) : "정수" -> 정수, "실수" -> 실수
</pre>
<button id="btn3">형변환 확인(콘솔 확인)</button>
<hr>
<h2>동등/동일 비교 연산자</h2>
<pre>
동등 비교 연산자 ( ==, != )
-> 값이 같으면 true (자료형과 관계가 없음)
ex) "1" == 1 == true(1)
동일 비교 연산자 ( ===, !==)
-> 값과 자료형이 모두 같아야 true
</pre>
<script src="JS/08_문자열, 숫자, 형변환, 연산자.js"></script>
</body>
</html>
// 문자열 관련 함수
document.getElementById("btn1").addEventListener("click", function(){
// 문자열.indexOf("str") :
// 문자열에서 "str"과 일치하는 부분이 시작되는 인덱스를 반환
// 없으면 -1 반환
const str1 = "Hello world";
console.log(str1.indexOf("e")); // 1
console.log(str1.indexOf("l")); // 2 (가장 먼저 검색된 인덱스 반환)
console.log(str1.indexOf("가")); // -1
// 문자열.substring(시작인덱스, 종료 인덱스(미포함)) : 문자열 일부 잘라내기
// 시작 인덱스 이상, 종료 인덱스 미만
const str2 = "abcdefg";
console.log(str2.substring(0,3)); // abc
console.log(str2.substring(2,6)); // cdef
// 문자열.split("구분자") : 문자열을 구분자로 잘라서 배열로 반환
const str3 = "햄버거, 비빔밥, 김밥, 라면, 파스타, 스테이크";
const arr = str3.split(", ");
// console.log(arr);
for(let i =0; i<arr.length; i++){
console.log(arr[i]);
}
})
// 숫자 관련 함수
document.getElementById("btn2").addEventListener("click", function(){
// Infinity 리터럴 확인
console.log(5/0);
if(5/0 == Infinity){
console.log("무한입니다.");
}
// NaN 리터럴 확인
console.log("aaa"*100);
// "aaa"*100 == Nan (X)
// isNan(값): 값이 NaN이면 true, 아니면 false 반환
if(isNaN("aaa"*100)) {
console.log("숫자가 아닙니다.");
}
// Math.random(): 0이상 1미만의 난수 발생 (0<=random<1)
// this.innerText=Math.random();
// 소수점 관련 함수
// round(), cell(), floor(), trunc()
// 반올림 올림 내림 절삭(버림)
// -> 소수점 자리를 지정할 수 없다.
console.log(Math.round(10.5)); //11
console.log(Math.ceil(10.5)); //11
console.log(Math.floor(-10.5)); //-11
console.log(Math.trunc(-10.5)); //-10
// 버튼 배경색 랜덤으로 바꾸기
const r = Math.floor(Math.random()*256); // 0~255
const g = Math.floor(Math.random()*256); // 0~255
const b = Math.floor(Math.random()*256); // 0~255
this.style.backgroundColor="rgb("+r+","+g+","+b+")";
// 숫자.toFixed(자릿수) : 지정된 자릿수까지 반올림해서 표현
console.log((1.45).toFixed(1));
})
// 형변환 확인
document.getElementById("btn3").addEventListener("click", function(){
console.log( parseInt("1.234") );
console.log( (parseFloat("1.234") )); // 숫자는 콘솔에 파란색
console.log(Number("1.234")); // 문자는 콘솔에 까만 색
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>08_배열</title>
</head>
<body>
<h1>배열(Array)</h1>
<pre>
배열 : 변수를 묶음으로 다루는 것(변수가 연속적으로 나열됨)
* JS 변수 : 값이 저장되기 전까지 자료형 지정되지 않음
JS 배열의 특징
1. 자료형 제한이 없다.
2. 길이 제한이 없다.
</pre>
<button id="btn1">배열확인1(콘솔)</button>
<hr>
<h3>배열 관련된 함수</h3>
<pre>
(Stack 구조 관련 함수)
push(): 배열의 마지막 요소로 추가
pop(): 배열의 마지막 요소 꺼내옴
배열.indexOf("값") : 일치하는 값을 가진 요소의 index를 반환
없으면 -1 반환
배열.sort([정렬기준 함수]) : 배열 내 요소를 오름차순 정렬(문자열 기준)
단, [정렬기준 함수]가 작성되면 정렬결과가 달라진다.
배열.toString() : 배열 요소를 하나의 문자열로 출력
-> 요소 사이에 "," 추가
배열.join("구분자") : 배열 요소를 하나의 문자열로 출력
-> 요소 사이에 "구분자" 추가
</pre>
<button id="btn2">배열확인2 (콘솔 확인)</button>
<script src="js/09_배열.js"></script>
</body>
</html>
// 배열 확인 1
document.getElementById("btn1").addEventListener("click", function(){
// 배열 선언 방법
const arr1 = new Array(3); // 3칸짜리 배열 생성
const arr2 = new Array(); // 0칸짜리 배열(비어있는 배열)
// console.log(arr1);
// console.log(arr2);
// 다른 자료형 대입
arr1[0] = "김밥";
arr1[1] = 123;
arr1[2] = true;
console.log(arr1);
// 0칸 배열에 대입 -> 자동으로 길이 증가
arr2[0] = "김밥";
arr2[1] = 123;
arr2[2] = true;
console.log(arr2);
// 배열 선언 방법
const arr3 = []; // 비어있는 배열(0칸)
const arr4 = ["사과", "딸기", "바나나"]; // 선언 및 초기화
// for문으로 배열 요소 반복 접근하기
// 1. 일반 for문
// 2. 향상된 for문 (for ... of) : 배열용 향상된 for문 for(변수 of 배열)
for(let item of arr4){ // arr4 배열에서 요소를 하나씩 얻어와 아이템에 대입
console.log(item);
}
})
// 배열 확인 2
document.getElementById("btn2").addEventListener("click", function() {
// 비어있는 배열 생성
const arr = [];
// push() : 배열 마지막 요소로 추가
arr.push("삼겹살");
arr.push("곱창");
arr.push("초밥");
arr.push("치킨");
console.log(arr);
// pop() : 배열 마지막 요소 꺼내오기
console.log("꺼내온 요소 : " + arr.pop());
console.log(arr);
// 배열.indexOf("값") : 일치하는 값을 가진 요소의 index를 반환
console.log("초밥 인덱스 : " + arr.indexOf("초밥"));
console.log("갈비 인덱스 : " + arr.indexOf("갈비")); //-1
// 배열.sort([정렬기준 함수]) : 배열 내 요소를 오름차순 정렬(문자열)
const arr2 = [5,3,2,10,1];
console.log(arr.sort()); // 문자열
console.log(arr2.sort()); // 숫자 -> 정상 정렬X
// 왜? -> 문자열로 변환되어서 정렬되기 때문
// 문자열 정렬 기준이 기본값이다.
// 숫자 오름차순 정렬
console.log(arr2.sort(function(a,b){ return a-b; }))
// 문자열로 출력
console.log(arr.toString());
console.log(arr.join("/"));
})