유효성 검사
데이터의 적절성을 확인하는 과정
정규 표현식
문자열의 특정 형태를 찾아내기 위한 패턴 표현식
let 변수명 = /정규 표현식/[Flag]
JavaScript
복사
let 변수명 = new RegExp('정규 표현식' , ['Flag'] )
JavaScript
복사
flag
•
i : ignore case : 대문자 소문자를 구분없이 검출
•
g : global : 문자열의 내의 모든 패턴 검출
•
m : multi : 문자열의 줄바꿈이 있는지 까지도 검출
구문 | 설명 | 예제 |
문자 | 일반 문자는 자체로 매치됩니다. | abc는 "abc"와 매치 |
. | 어떤 문자 하나와 매치됩니다. | a.c는 "abc"와 매치 |
\d | 숫자(digit)와 매치됩니다. | \d+는 "123"와 매치 |
\D | 숫자가 아닌 문자와 매치됩니다. | \D+는 "abc"와 매치 |
\w | 문자(word character)와 매치됩니다. | \w+는 "hello"와 매치 |
\W | 문자가 아닌 문자와 매치됩니다. | \W+는 "123!"와 매치 |
\s | 공백 문자와 매치됩니다. | \s+는 " \t\n"와 매치 |
\S | 공백이 아닌 문자와 매치됩니다. | \S+는 "abc123"와 매치 |
^ | 문자열의 시작과 매치됩니다. | ^abc는 "abcdef"와 매치하지 않음 |
$ | 문자열의 끝과 매치됩니다. | xyz$는 "xyz123"와 매치하지 않음 |
[abc] | 대괄호 안의 어떤 문자(a, b, c)와 매치됩니다. | [aeiou]는 "apple"에서 "a"와 매치 |
[^abc] | 대괄호 안의 어떤 문자(a, b, c)를 제외한 문자와 매치됩니다. | [^aeiou]는 "apple"에서 "p", "l" 등과 매치 |
[a-z] | a부터 z까지 범위의 문자와 매치됩니다. | [a-z]+는 "hello"에서 "hello"와 매치 |
(x) | 그룹을 나타내며, x를 매치합니다. | (abc)+는 "abcabc"와 매치 |
x|y | x 또는 y 매치합니다 | x|y 는 “x” 또는 “y” 와 매치 |
x? | x가 0 또는 1회 나타날 때 매치합니다. | ab?c는 "abc"와 "ac"와 매치 |
x* | x가 0회 이상 나타날 때 매치합니다. | ab*c는 "ac", "abc", "abbc" 등과 매치 |
x+ | x가 1회 이상 나타날 때 매치합니다. | ab+c는 "abc", "abbc" 등과 매치 |
x{m} | x가 정확히 m회 나타날 때 매치합니다. | a{2}는 "aa"와 매치 |
x{m, n} | x가 최소 m회에서 최대 n회까지 나타날 때 매치합니다. | a{1,3}는 "a", "aa", "aaa"와 매치 |
x{m,} | x가 최소 m회 이상 나타날 때 매치합니다. | a{2,}는 "aa", "aaa" 등과 매치 |
x | y | x 또는 y와 매치됩니다. |
정규표현식 메소드
•
test( ) : 문자열이 지정한 정규표현식에 부합한지 여부 반환 (true/false)
•
exec( ) : 문자열이 지정한 정규표현식에 부합한 문자열을 추출하여 반환
아이디 검사
•
영어, 한글, 숫자만 부합
/^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣]+$/
JavaScript
복사
let regExpId = /^[a-zA-Z0-9ㄱ-ㅎㅏ-ㅣ가-힣]+$/
Java
복사
이름 검사
•
한글만 부합
/^[가-힣]*$/
JavaScript
복사
let regExpName = /^[가-힣]*$/
Java
복사
전화번호 검사
•
XXX-XXX-XXXX 또는 XXX-XXXX-XXXX 만 부합
/^\d{3}-\d{3,4}-\d{4}$/
JavaScript
복사
let regExpPhone = /^\d{3}-\d{3,4}-\d{4}$/
Java
복사
이메일 검사
•
(첫글자 영문자)(영어,숫자, _ - . )@(영어).(영어)
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
JavaScript
복사
let regExpEmail = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
Java
복사
비밀번호 검사
•
영어, 숫자 포함 8글자 이상 (특수문자 허용)
/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
JavaScript
복사
let passwordPattern = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
JavaScript
복사
•
?= : 현재 위치에서 괄호 안의 패턴이 앞쪽에 있는지 확인
•
a(?=b) : ab
, ac
, acb 
, ac
, acb 
패턴 | 설명 |
(?=.*[A-Za-z]) | 영문자 중 적어도 하나 이상 존재 (. 한글자 , * 0~, ) |
(?=.*\d) | 적어도 숫자 하나 이상 존재 |
(?=.*[@$!%*?&]) | 적어도 “@$!%*?&” 특수 기호 중 하나 이상 존재 |
[A-Za-z\d@$!%*?&] | 영문, 숫자, 특수문자 구성 |
{8,} | 8자 이상 |
예시코드
•
Java 라는 문자 대소문자 구분 없이 검사
•
아이디, 이름, 전화번호, 이메일 패턴 검사
•
로그인 유효성 검사
•
회원가입 유효성 검사
Java 라는 문자 대소문자 구분 없이 검사
•
regexp01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>정규표현식</title>
</head>
<body>
<h1>정규표현식</h1>
<form name="form" onsubmit="return checkForm()">
<p>제목 : <input type="text" name="title" /></p>
<p><input type="submit" value="등록" /></p>
</form>
<script>
function checkForm() {
let regExp = /Java/i // Java 라는 문자열을 대소문자 구분없이 검사
let str = document.form.title.value
let result = regExp.exec(str)
// exec() : 정규 표현식에 부합한 문자열 반환
// test() : 정규 표현식에 부합한지 여부를 반환(true/false)
if( regExp.test(str) ) {
alert(result[0])
}
return false
}
</script>
</body>
</html>
HTML
복사
아이디, 이름, 전화번호, 이메일 패턴 검사
•
regexp02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>정규표현식</title>
</head>
<body>
<h1>정규표현식</h1>
<form name="form" onsubmit="return checkForm()">
<p>제목 : <input type="text" name="title" /> </p>
<p>아이디 : <input type="text" name="id" /> </p>
<p>이름 : <input type="text" name="name" /> </p>
<p>전화번호 : <select name="phone1">
<option value="010">010</option>
<option value="011">011</option>
<option value="016">016</option>
<option value="017">017</option>
<option value="019">019</option>
</select>
- <input type="text" maxlength="4" size="4" name="phone2">
- <input type="text" maxlength="4" size="4" name="phone3">
<p>이메일 : <input type="text" name="email" /> </p>
<p><input type="submit" value="등록" /> </p>
</form>
<script>
// 회원가입 정규 표현식으로 유효성 검사
function checkForm() {
// 아이디 패턴 : 영문자, 한글 시작
let regExpId = /^[a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣]+$/
// 이름 패턴 : 한글
let regExpName = /^[가-힣]*$/
// 전화번호 패턴 : [3자리 숫자]-[3~4자리 숫자]-[4자리 숫자]
let regExpPhone = /^\d{3}-\d{3,4}-\d{4}$/
// 이메일 패턴 [숫자,영문자]@[숫자,영문자].~~.[영문자2~3자리]
// OOO@OOOO.com
// OOO@OOOO.co.kr
// OOO@OOOO.ac.kr
// OOO@OOOO.org
let regExpEmail = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
// 분석 - /^[0-9a-zA-Z](-_\.)?[0-9a-zA-Z]*
// /^[0-9a-zA-Z](-_\.)?[0-9a-zA-Z]*
// ^[0-9a-zA-Z] : 시작은 숫자 또는 영어
// (-_\.)? : 중간에 -, _, . 0 또는 1회 가능
// [0-9a-zA-Z]* : 그 후에는 숫자 또는 영어가 0 또는 1회이상
// 전체 분석
// (1) : /^[0-9a-zA-Z](-_\.)?[0-9a-zA-Z]*
// (2) : @
// (3) : [0-9a-zA-Z](-_\.)?[0-9a-zA-Z]*
// (4) : .
// (5) : [a-zA-Z]{2,3}$/i
// 가능
// joeun
// joeun1004
// joeun_1004
// joeun-1004
// 1004joeun
// 1004-joeun
// joeun.1004
// 불가능
// -joeun
// _jouen
let id = form.id.value
let name = form.name.value
let phone = form.phone1.value + "-" + form.phone2.value + "-" + form.phone3.value
let email = form.email.value
// test() : 부합O-true, 부합X-false
if( !regExpId.test(id) ) {
alert('아이디를 형식에 맞게 입력해주세요')
return false
}
if( !regExpName.test(name) ) {
alert('이름 형식에 맞게 입력해주세요')
return false
}
if( !regExpPhone.test(phone) ) {
alert('전화번호 형식에 맞게 입력해주세요')
return false
}
if( !regExpEmail.test(email) ) {
alert('이메일 형식에 맞게 입력해주세요')
return false
}
}
</script>
</body>
</html>
HTML
복사
로그인 유효성 검사
•
validation01.jsp
•
validation01_pro.jsp
•
validation01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>아이디 비밀번호 유효성 검사</title>
</head>
<body>
<h1>로그인</h1>
<h3>유효성 검사</h3>
<!--
onsubmit="return 여부"
- 여부 : true 이면, submit(요청전송)
false 이면, sumbmit 안 함
-->
<form name="loginForm" onsubmit="return checkLogin()" action="validation01_pro.jsp" method="post">
<p>아이디 : <input type="text" name="id" maxlength="20" /></p>
<p>비밀번호 : <input type="password" name="pw" /></p>
<p><input type="submit" value="로그인"></p>
</form>
<script>
// 로그인 유효성 검사
function checkLogin() {
// alert("로그인 요청")
let form = document.loginForm // name이 loginForm 인 폼 요소를 가져옴
let id = form.id.value
let pw = form.pw.value
// alert(id)
// alert(pw)
// 1. 아이디는 필수값, 6~20자 이내
// 아이디 입력여부 검증
if( id == "" ) {
alert('아이디를 입력해주세요')
form.id.focus() // id input 태그에 포커스
return false
}
// 아이디 글자 수 검증
if( id.length < 6 || id.length > 20 ) {
alert('아이디는 6~20자 이내로 입력 가능합니다.')
form.id.select() // id 입력 값을 선택
return false
}
// 2. 비밀번호는 필수값, 6자 이상
// 비밀번호 입력여부 검증
if( pw == "" ) {
alert('비밀번호를 입력해주세요')
form.pw.focus() // pw input 태그에 포커스
return false
}
// 비밀번호 글자 수 검증
if( pw.length < 6 ) {
alert('비밀번호는 6자 이상으로 입력해야합니다.')
form.id.select() // pw 입력 값을 선택
return false
}
return true
}
</script>
</body>
</html>
HTML
복사
•
validation01_pro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사</title>
</head>
<body>
<h3>로그인에 성공했습니다.</h3>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
<p>아이디 : <%= id %> </p>
<p>비밀번호 : <%= pw %> </p>
</body>
</html>
HTML
복사
회원가입 유효성 검사
•
validation02.jsp
•
validation02_pro.jsp
•
validation02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원가입</h1>
<h3>유효성 검사</h3>
<form name="joinForm" onsubmit="return checkJoin()" action="validation02_pro.jsp" method="post">
<p>아이디 : <input type="text" name="id" maxlength="20" /></p>
<p>비밀번호 : <input type="password" name="pw" /></p>
<p>이름 : <input type="text" name="name" /></p>
<p>나이 : <input type="text" name="age" onkeyup="checkNumber()" /></p>
<p><input type="submit" value="회원가입"></p>
</form>
<script>
// 회원가입 유효성 검사
function checkJoin() {
let form = document.joinForm // name이 joinForm 인 폼 요소를 가져옴
let id = form.id.value
let pw = form.pw.value
// alert(id)
// alert(pw)
// 1. 아이디는 필수값, 6~20자 이내
// 아이디 입력여부 검증
if( id == "" ) {
alert('아이디를 입력해주세요')
form.id.focus() // id input 태그에 포커스
return false
}
// 아이디 글자 수 검증
if( id.length < 6 || id.length > 20 ) {
alert('아이디는 6~20자 이내로 입력 가능합니다.')
form.id.select() // id 입력 값을 선택
return false
}
// 2. 비밀번호는 필수값, 6자 이상
// 비밀번호 입력여부 검증
if( pw == "" ) {
alert('비밀번호를 입력해주세요')
form.pw.focus() // id input 태그에 포커스
return false
}
// 비밀번호 글자 수 검증
if( pw.length < 6 ) {
alert('비밀번호는 6자 이상으로 입력해야합니다.')
form.id.select() // id 입력 값을 선택
return false
}
// 3. 이름은 필수값, 첫글자는 숫자로 사용 불가
let name = form.name.value
if( name == "" ) {
alert('이름을 입력해주세요')
form.name.focus()
return false
}
// isNaN() : 숫자가 아니면 true
if( !isNaN( name.substr(0, 1) ) ) {
alert('이름은 숫자로 시작할 수 없습니다.')
form.name.select()
return false
}
return true
}
// 나이 유효성 검사
function checkNumber() {
let form = document.joinForm
console.log( event.keyCode )
// 숫자가 아닌 경우
if( !(event.keyCode >= 48 && event.keyCode <= 57 ) ) {
alert('숫자만 입력 가능합니다.')
event.returnValue = false
form.age.value = ''
}
}
</script>
</body>
</html>
HTML
복사
•
validation02_pro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사</title>
</head>
<body>
<h3>회원가입에 성공했습니다.</h3>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String age = request.getParameter("age");
%>
<p>아이디 : <%= id %> </p>
<p>비밀번호 : <%= pw %> </p>
<p>이름 : <%= name %> </p>
<p>나이 : <%= age %> </p>
</body>
</html>
HTML
복사







한글자 , *