정규표현식(Regular Expression)
특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어로 정규표현식을 이용하여 입력된 문자열에 대한
특정 조건 검색, 일치여부 판단, 치환 등에 대한 조건문을 간단히 처리할 수 있다.(유효성 검사시 사용)
<참고사이트>
1. 작성한 정규표현식을 그림으로 나타내줌(사용 잘 안함) http://regexper.com
2. 정규표현식 테스트(자주 사용) http://regexr.com
3. MDN 정규표현식 안내 https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
정규표현식 객체 생성 및 확인하기
1. 정규표현식 객체 생성 방법
//1
const regExp = new RegExp("정규표현식")
//2 (양쪽 슬래시 기호는 정규표현식의 리터럴 표기법)
const regExp2 = /정규표현식/
2. 문자열 패턴 확인 함수
//1. 문자열에 정규표현식과 일치하는 패턴이 있을 경우 true, 없으면 false
regExp.test("문자열")
//2. 문자열에 정규표현식과 일치하는 패턴이 있을 경우 해당 문자열을 반환, 없으면 null을 반환
regExp.exec("문자열")
확인하기 (html 생략)
document.getElementByID("check1").addEventListenr("click", function(){
// 정규표현식 객체 생성
const regEx1 = new RegExp("script")
const regEx2 = /java/
// 검사할 문자열
const str1 = "javascript 정규표현식"
const str2 = "java, html, css, js 사용중"
const str3 = "heyjava, java, java"
// 1. "string" 문자열 확인
console.log("1. regEx1.test(str1): " + regEx1.test(str1));
console.log("2. regEx1.exec(str1): " + regEx1.exec(str1));
console.log("3. regEx1.test(str2): " + regEx1.test(str2));
console.log("4. regEx1.exec(str2): " + regEx1.exec(str2));
console.log("5. regEx1.test(str3): " + regEx1.test(str3));
console.log("6. regEx1.exec(str3): " + regEx1.exec(str3));
console.log("-----")
// 2 "java" 문자열을 확인
console.log("1. regEx2.test(str1): " + regEx2.test(str1));
console.log("2. regEx2.exec(str1): " + regEx2.exec(str1));
console.log("3. regEx2.test(str2): " + regEx2.test(str2));
console.log("4. regEx2.exec(str2): " + regEx2.exec(str2));
console.log("5. regEx2.test(str3): " + regEx2.test(str3));
console.log("6. regEx2.exec(str3): " + regEx2.exec(str3));
console.log(regEx2.exec(str3))
}
정규표현식 메타문자
문자열의 패턴을 나타내는 문자
a : 문자열 내에 a라는 문자열이 존재하는지 검색
[abcd] : 문자열 내에 a, b, c, d 중 하나라도 일치하는 문자가 있는지 검색
^(캐럿) : 문자열의 시작
$(달러) : 문자열의 끝
\w (word, 단어) : 아무 글자(띄어쓰기, 특수문자, 한글 제외)
\d (digit, 숫자) : 아무 숫자(0~9)
\s (space, 공간) : 아무 공백 문자(띄어쓰기, 엔터, 탭 등)
-> 소문자/대문자 구분 중요: 대문자인 경우 Not의 뜻을 가지고 있음.
[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개 이상
a{,5} : a가 5개 이하
* : 0개 이상, 0번 이상 반복 (= 있어도 되고 없어도 됨)
+ : 1개 이상, 1번 이상 반복
? : 0개 또는 한 개
. : 한 칸(개행문자 제외한 문자 하나)
확인하기
// 결과 출력용 div
const div1 = document.getElementById("div1")
// [abcd]: 문자열 내에 a, b, c, d 중 하나라도 일치하는 문자가 있는지 검색
const regEx1 = /[abcd]/
div1.innerHTML += "/[abcd]/, apple : " + regEx1.test("apple") + "<br>"
div1.innerHTML += "/[abcd]/, qwerty : " + regEx1.test("qwerty") + "<hr>"
// ^(캐럿): 문자열의 시작
const regEx2 = /^group/
div1.innerHTML += "/^group/, group100 : " + regEx2.test("group100") + "<br>"
div1.innerHTML += "/^group/, 100group : " + regEx2.test("100group") + "<hr>"
//^[abcd] : 문자열이 a, b, c, d 중 하나로 시작하는지 검색
const regEx3 = /^[abcd]/
div1.innerHTML += "/^[abcd]/, group : " + regEx3.test("group") + "<br>"
div1.innerHTML += "/^[abcd]/, car : " + regEx3.test("car") + "<br>"
div1.innerHTML += "/^[abcd]/, dark : " + regEx3.test("dark") + "<hr>"
//$(달러) : 문자열의 끝
const regEx4 = /team$/
div1.innerHTML += "/team4/, A-team : " + regEx4.test("A-team") + "<br>"
div1.innerHTML += "/team4/, team-A : " + regEx4.test("team-A") + "<hr>"
* 응용
- a~d-team이 모두 true이려면 : /[a,b,c,d]-team$/
- 시작은 영어 대문자, 끝은 숫자 : /^[A-Z][0-9]$/
- 특수문자를 제외한 문자 하나 : /^[a-zA-Z0-9ㄱ-힣]$/
🥸 실습1: 이름 유효성 검사
<조건>
1. 한글 2글자 이상 6글자 이하의 문자열
2. 단자음, 단모음 안됨
3. 유효한 경우 초록색 글씨로 "유효한 이름 형식입니다."
4. 잘못된 경우 빨간색 글씨로 "잘못된 이름 형식입니다."
<head>
<style>
.confirm {
color: green;
font-weight: bold;
}
.error {
color: red;
font-weight: bodl;
}
</style>
</head>
<body>
이름: <input id = "input1" type = "text">
<span id = "result1"></span>
</body>
const input1 = document.getElementyById("input1")
const result1 = document.getElementyById("result1")
cosnt nameTest = /^[가-힣]{2,6}$/
input1.addEventListener("keyup", function(){
if(nameTest.test(input1.value)) { // or (this.value)
result1.innerHTML = "유효한 이름입니다."
result1.classList.add("confirm")
result1.classList.remove("error")
} else {
result1.innerHTML = "잘못된 이름입니다."
result1.classList.add("error")
result1.classList.remove("confirm")
}
})
* classList(): 요소가 가진 클래스를 배열로 반환
- 요소.classList.add("클래스명") : 요소에 특정 클래스 추가
- 요소.classList.remove("클래스명") : 요소에 특정 클래서 삭제
- 요소.classList.toggle("클래스명") : 클래스에 요소가 있으면 제거, 없으면 추가
🥸 실습: 회원가입 양식 만들고 유효성 검사
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입</title>
<link rel="stylesheet" href="/회원가입.css">
<style>
.confirm{
color: white;
background-color: lightseagreen;
}
.error{
color: white;
background-color: lightcoral
}
</style>
</head>
<body>
<form action="/회원가입다음페이지.html" onsubmit="return validate()" method="GET">
<fieldset>
<legend>회원가입</legend>
<table height = "300px">
<tr>
<td>아이디</td>
<td><input type="text" id="idInput" autocomplete="off"></td>
<td><button>중복확인</button></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" id="pwInput"></td>
</tr>
<tr>
<td>비밀번호 확인</td>
<td><Input type="password" id="pwConfirm"></Input></td>
<td><span id="pwResult"></span></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" id="nameInput" autocomplete="off"></td>
<td><span id="nameResult"></span></td>
</tr>
<tr>
<td>성별</td>
<td>
<label>남자<input type="radio" name="gender" value="male"></label>
<label>여자<input type="radio" name="gender" value="female"></label>
</td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" id="numberInput" autocomplete="off"></td>
</tr>
</table>
<div>
<button type="reset">초기화</button>
<button type="submit">회원가입</button>
</div>
</fieldset>
</form>
<script src="/회원가입.js"></script>
</body>
</html>
/* 1. 아이디 유효성 검사
1) 영어 소문자로 시작
2) 영어 대소문자 / 숫자 / -,_ 로만 이루어진 6~14글자 사이
3) 형식이 일치할 경우 입력창 배경색이 초록색, 불일치할 경우 빨간색 */
const idInput = document.getElementById("idInput")
idInput.addEventListener("keyup", function(){
const regId = /^[a-z]([a-zA-Z0-9-_]){5,13}$/;
if(regId.test(idInput.value)){
idInput.classList.add("confirm")
idInput.classList.remove("error")
} else {
idInput.classList.add("error")
idInput.classList.remove("confirm")
}
})
/*2. 비밀번호 유효성 검사
1) 비밀번호란 미입력 후 비밀번호 확인을 입력하면 "비밀번호를 입력하세요."라는 경고창이 뜨고 비밀번호란에 focus(커서 이동)
2) 비밀번호와 비밀번호 확인에 입력된 비밀번호가 같아야 함. 불일치하면 옆에 경고문구 출력 */
const pwInput = document.getElementById("pwInput")
const pwConfirm = document.getElementById("pwConfirm")
const pwResult = document.getElementById("pwResult")
pwConfirm.addEventListener("keyup", function() {
//1. 경고창 출력
if(pwInput.value.trim().length == 0) {
alert("비밀번호를 먼저 입력하세요.")
pwConfirm.value=""
pwInput.focus()
}
//2. 비밀번호 일치 확인
if(pwInput.value == pwConfirm.value) {
pwResult.innerHTML = "비밀번호 일치"
pwResult.style.color = "lightseagreen"
} else {
pwResult.innerHTML = "비밀번호 불일치"
pwResult.style.color = "lightcoral"
}
})
/* 3. 이름 유효성 검사
- 한글 2~5글자 사이 문자열
- 형식이 일치할 경우 입력란 옆에 "정상입력", 불일치할 경우 "형식에 맞지 않습니다." 출력 */
const nameInput = document.getElementById("nameInput")
const nameResult = document.getElementById("nameResult")
nameInput.addEventListener("keyup", function(){
const regName = /^[가-힣]{2,5}$/
if(regName.test(nameInput.value)) {
nameResult.innerHTML = "정상입력"
nameResult.style.color = "lightseagreen"
} else{
nameResult.innerHTML = "2~5글자의 한글만 입력하세요."
nameResult.style.color = "lightcoral"
}
})
/* 4. 성별, 전화번호 유효성 검사
1) 성별
: 선택되지 않은 경우 "성별을 선택해주세요." 라는 경고창 출력
2) 전화번호
: 000-0000-0000 형식에 맞지 않은 경우 "전화번호 양식을 올바르게 입력하세요." 라는 경고창 출력 */
function validate(){
// 1. 성별 : 체크된 라디오만 얻어오기
const gender = document.querySelector("input[name='gender']:checked")
if(gender == null) {
alert("성별을 선택하세요.")
return false;
// return false 가 없는 경우 성별이 선택되지 않아도 전송 후 다음 창으로 넘어가고
// 성별을 선택했지만 밑의 전화번호 형식이 틀렸을 경우에도 성별 경고창이 또 뜨게 된다.
// 꼭 submit의 기본 이벤트를 제거해주어야 한다.
}
// 2. 전화번호
const numberInput = document.getElementById("numberInput")
const regNumber = /^[0][0-9]{1,2}-[0-9]{3,4}-[0-9]{4}$/
if(!regNumber.test(numberInput.value)) {
alert("전화번호를 형식이 올바르지 않습니다.")
return false;
}
}
'JS > JavaScript' 카테고리의 다른 글
8. 배열 (0) | 2023.03.01 |
---|---|
7. 형변환, 비교연산자, 문자열/숫자 내장함수 (0) | 2023.03.01 |
5. 이벤트 (0) | 2023.02.25 |
4. 변수와 자료형 (0) | 2023.02.25 |
3. 요소 접근 방법 (1) | 2023.02.24 |