기타 [TIP] 정규표현식(Pattern Matching) 완전 정리!-전화번호 정규식, 이메일 정규식, 빈값체크 정규식
페이지 정보
본문
표현식 | 설명 |
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 임의의 한 문자 (문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 |
* | 앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나있음 |
[] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} | 횟수 또는 범위를 나타낸다. |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
| | 패턴 안에서 or 연산을 수행할 때 사용 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 숫자 [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자 |
\ | 정규표현식 역슬래시(\)는 확장 문자 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i) | 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
전화번호 정규식, 이메일 정규식, 빈값체크 정규식
모든 공백 체크 정규식
var regExp = /\s/g;
숫자만 체크 정규식
var regExp = /^[0-9]+$/;
이메일 체크 정규식
var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i;
휴대(핸드)폰번호 정규식
var regExp = /^\d{3}-\d{3,4}-\d{4}$/;
var regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
var regPhone = /^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$/;
if (regPhone.test(text) === true) {
alert('입력된 값은 휴대전화번호입니다.');
}
일반 전화번호 정규식
var regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
모든 전화번호 검증 정규식
var regExp = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?[0-9]{3,4}-?[0-9]{4}$/;
아이디나 비밀번호 정규식
var regExp = /^[a-z0-9_]{4,20}$/;
이메일 정규식
var regEmail = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/;
if (regEmail.test(text) === true) {
alert('입력된 값은 이메일입니다.');
}
01로 시작하는 핸드폰 및 지역번호와 050, 070 검증
-(하이픈)은 넣어도 되고 생략해도 되나 넣을 때에는 정확한 위치에 넣어야 함.
var regExp = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?[0-9]{3,4}-?[0-9]{4}$/;
var tel = '010-1234-1234';
if( !regExp.test(tel) ) {
alert('메시지');
}
1. 숫자만 입력
입력 받을 때의 값을 알아야 하기 때문에 keyup 이벤트를 사용합니다.
keyup : 키보드가 눌려있다가 떼는 순간 발생
keydown : 키보드가 눌려있을때 발생
keypress : 키보드가 눌리는 순간 발생
$("#" + id).bind("keyup", function(event) {
var regNumber = /^[0-9]*$/;
var temp = $("#" + id).val();
if(!regNumber.test(temp))
{
console.log('숫자만 입력하세요');
$("#"+id).val(temp.replace(/[^0-9]/g,""));
}
});
2번째 라인은 숫자만 있는지 체크하는 정규식입니다
var regNumber = /^[0-9]*$/;
7번 라인은 0에서 9 숫자가 아니면 빈 값으로 변경해 텍스트 박스에 값을 넣게 됩니다.
이렇게 되면 사용자는 입력할때 한글이나 영어, 특수기호를 써도 바로 공백으로 변환시켜 버리기 때문에
숫자밖에 입력을 못하게 됩니다.
2. 세자리 수마다 , 찍기
세자리 수마다 , 찍는 것처럼 표현을 하려면 1번 예제 7번 라인에서 아래 부분만 수정하면 됩니다.
$("#"+id).val(temp.replace(/\B(?=(\d{3})+(?!\d))/g, ","));
3. 휴대폰 / 전화번호
/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/g
값을 입력받을 때마다 '-'(하이픈)을 자동으로 넣고 싶으면
( /(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/, "$1-$2-$3" );
4. 주민등록번호
^(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))-[1-4][0-9]{6}$/g
5. 이메일
/^[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[@]{1}[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[.]{1}[A-Za-z]{1,5}$/g
오늘은 자바에서 지원하는 정규표현식을 이용해서 사용자가 설계된 원하는 값만 입력할 수 있도록 코드를 짜보겠습니다.
먼저 예제를 보여드린 뒤 자세히 알아보아요
예제1) 숫자만 허용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class OnlyInteger { public static void main(String[] args) { Pattern p = Pattern.compile("(^[0-9]*$)"); int onlyNum; String inputVal; Scanner iStream = new Scanner(System.in); inputVal = iStream.nextLine(); Matcher m = p.matcher(inputVal); if(m.find()) { onlyNum = Integer.parseInt(inputVal); System.out.println(onlyNum); } else { System.out.println("숫자가 아닌데..?"); } } } |
▲ 사용자 입력값이 숫자인지 검증하는 OnlyInteger Class 입니다.
2 3 | import java.util.regex.Matcher; import java.util.regex.Pattern; |
▲ 정규표현식을 사용하기 위해 import해줍니다.
10 | Pattern p = Pattern.compile("(^[0-9]*$)"); |
▲ 숫자만 허용하는 Pattern p 입니다.
17 | Matcher m = p.matcher(inputVal); |
▲ inputVal의 값이 저희가 선언한 패턴 p 에 맞는 조건인지 검사해서 m에 저장합니다.
19 | if(m.find()) |
▲ m.find() 는 패턴이 일치하는경우 boolean 형으로 true를 아니면 false를 리턴합니다.
21 | onlyNum = Integer.parseInt(inputVal); |
▲ inputVal을 int형으로 형변환 해줍니다.
정규표현식 설명
대충 구조는 알았고 그럼 패턴을 만드는 방법을 알아보겠습니다.
10 | Pattern p = Pattern.compile("(^[0-9]*$)"); |
아까 예제1) 에서 사용한 Pattern 을 보면 "(^[0-9]*$)" 이 부분이 바로 패턴 부분입니다.
각각 의미를 알아보면..
▲ 출처 : http://lng1982.tistory.com/141
이렇게 되시겠습니다.
예제의 ^[0-9]*$ 를 분석해보면
^ 으로 우선 패턴의 시작을 알립니다.
[0-9] 괄호사이에 두 숫자를 넣어 범위를 지정해줄 수 있습니다.
* 를 넣으면 글자 수를 상관하지 않고 검사합니다.
$ 으로 패턴의 종료를 알립니다.
즉 , 0부터 9 까지의 수를 글자 수 제한을 하지 않고 검사하는 패턴입니다.
[자주 쓰이는 패턴]
1) 숫자만 : ^[0-9]*$
2) 영문자만 : ^[a-zA-Z]*$
3) 한글만 : ^[가-힣]*$
4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$
5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
7) 일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$
8) 주민등록번호 : \d{6} \- [1-4]\d{6}
9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})
예제2) 영어만 허용 (Not Case Sensitive)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import java.util.regex.Pattern; public class EngPattern { public static void main(String[] args) { String pattern = "^[a-zA-Z]*$"; String input = "ABzzzDAWRAWR"; boolean i = Pattern.matches(pattern, input); if(i==true) { System.out.println(input+"는 패턴에 일치함."); } else { System.out.println("패턴 일치하지 않음."); } } } |
패턴분석
^[a-zA-Z]*$
a-z 까지 그리고 A-Z 까지 즉, 알파벳은 모두 허용.
* 글자 수 상관하지 않음
-> 알파벳이기만 하면 패턴에 맞음.
예제3) 파일 확장자 확인 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package Pattern; import java.util.regex.Pattern; public class ExtendtionPattern { public static void main(String[] args) { String pattern = "^\\S+.(?i)(txt|pdf|hwp|xls)$"; String input = "abc.txt"; boolean i = Pattern.matches(pattern, input); if(i==true) { System.out.println(input+"는 패턴에 일치함."); } else { System.out.println("패턴 일치하지 않음."); } } } |
패턴분석
^\\S+.(?i)(txt|pdf|hwp|xls)$
^ : 시작
\ : \ 가 왔기 때문에 다음에 올 문자는 특수문자로 취급하고 , \다음 특수문자고 오면 그 자체로 취급.
\S : 공백 아닌 문자
+. : .이 반드시 한개는 와야한다.
(?i) : 대소문자 구별하지 않음.
(txt|pdf|hwp|xls) : txt 혹은 pdf 혹은 hwp 혹은 xls 만 허용. | 을 이용한 or 연산!
$ : 끝
-> 공백아닌 문자와 .이 반드시 와야하고 뒤에는 txt, pdf, hwp, xls 만 허용.
예제4) 파일 확장자 1, 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.util.regex.Pattern; public class extensionPattern { public static void main(String[] args) { String pattern = "^\\S+.(?i)(txt|pdf|hwp|xls)$"; String input = "Java.pdf"; String pattern2 = "(.+?)((\\.tar)?\\.gz)$"; String input2 = "library.tar.gz"; vaildPattern(pattern, input); vaildPattern(pattern2, input2); } public static void vaildPattern(String pattern, String input) { boolean i = Pattern.matches(pattern, input); if(i==true) { System.out.println(input+"는 패턴에 일치함."); } else { System.out.println("패턴 일치하지 않음."); } } } |
새로 이중 확장자를 구분하는 표현식을 추가했습니다. 여기서는 tar.gz 인지 구분합니다. 한번 테스트 해보세요
- 이전글[쇼핑] Daweikala 새로운 32700 12800mAh 3.2V lifepo4 충전식 배터리 전문 리튬 철 인산염 전원 배터리 (나사 포함) 22.02.09
- 다음글자주 쓰이는 정규식(Regular Expression) 22.01.11
댓글목록
등록된 댓글이 없습니다.