자유게시판

IT HUB를 찾아주셔서 감사합니다.

기타 [TIP] 정규표현식(Pattern Matching) 완전 정리!-전화번호 정규식, 이메일 정규식, 빈값체크 정규식

페이지 정보

profile_image
작성자 하나를하더라도최선을
댓글 0건 조회 10,407회 작성일 22-01-28 09:55

본문

표현식

 설명 

 ^

 문자열의 시작

 문자열의 종료

 .

 임의의 한 문자 (문자의 종류 가리지 않음)

 단, \ 는 넣을 수 없음

 *

 앞 문자가 없을 수도 무한정 많을 수도 있음

 앞 문자가 하나 이상

 앞 문자가 없거나 하나있음

 []

 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 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 인지 구분합니다. 한번 테스트 해보세요


 

댓글목록

등록된 댓글이 없습니다.