PostIT

[Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기 본문

Java

[Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기

shun10114 2017. 6. 2. 16:13

# [Java/Regex] 자바 정규표현식에 대해서 공부하고 예제 만들기


최종작성일 : 2017년 6월 2일


## 배경


Web Project를 진행하면 Client에게서 어떠한 정보가 입력될지 모르기에, 이 정보를 정규화하는 과정이 필요합니다. 이를 유효성 검사라고 하는데 유효성검사를 제대로 하지않으면, 데이터의 신뢰도가 떨어지게 되고, 예기치 않은 에러를 발생시키기 때문입니다. 이를 위해서는 각 언어마다 정규표현식을 제공해주고 있으며, 크게 다르지 않습니다.


그렇다면, 이번 블로그를 통해 Java의 정규표현식에 대해서 알아보겠습니다.



## 목적 

  • 자바의 정규표현식의 규칙을 이해하고, 예제를 만들어서 새로운 정규형식을  만들어보겠습니다.



## 내용 

표현식

 설명 

 ^

 문자열의 시작

$

 문자열의 종료

 .

 임의의 한 문자(필수입력, 문자의 종류 가리지 않음) 

 단, \ 는 넣을 수 없음

 *

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

+

 앞 문자가 하나 이상

?

 앞 문자가 없거나 하나있음

 []

 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.

 {}

 횟수 또는 범위를 나타낸다.

 ()

 소괄호 안의 문자를 하나의 문자로 인식 

 |

 패턴 안에서 or 연산을 수행할 때 사용

 \s

 공백 문자

 \S

 공백 문자가 아닌 나머지 문자

 \w

 알파벳이나 숫자

\W 

 알파벳이나 숫자를 제외한 문자

\d 

 숫자 [0-9]와 동일

\D 

 숫자를 제외한 모든 문자

 정규표현식 역슬래시(\)는 확장 문자
 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미

(?i) 

 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음



간단하게 정적변수로 선언해서 테스트 할 수 있는 예제 코드를 만들어보겠습니다.

지역 정적변수로 선언된 패턴에 더 입력하실 수 있습니다.

eixt를 입력하면 종료됩니다. 아니면 계속 테스트 해볼 수 있습니다.


import java.util.Iterator;

import java.util.Scanner;


public class TestJava {

//지역 정적변수 - 패턴을 바꾸고 싶을 떄 여기를 바꾸세요. 더 갯수를 늘려 테스트하고싶으면

// for문 안에 있는 i(=4)를 맞게 늘려주시고, switch case에 추가해주세요.


    final private static String pattern1 = "^[가-힣]*$";

    final private static String pattern2 = "^[a-zA-Z]*$";

    final private static String pattern3 = "^[0-9]*$";

    final private  static String pattern4 = "^[a-zA-Z가-힣]*$";

    

public static void main(String[] argrs) {

Scanner scan=new Scanner(System.in);

reInput(scan);

}

private static void reInput(Scanner scan){

System.out.println("parameter을 입력해주세요.(한글 재입력시 숫자나 영어를 입력하고 지우고 입력해주세요. 바이트 문제로 인해 입력 불가능 문제");

String parameter = scan.next();

if(parameter.equals("exit")){

System.out.println("종료합니다.");

return;

} else {

for (int i = 0; i < 4; i++) {

validPattern(parameter, i);

}

System.out.println("------------------------------");

reInput(scan);

}

}


    //Pattern에 틀리면 True || 맞으면 False


    private static boolean validPattern(String parameter, int patternNo) {

        boolean validation = false;

        switch (patternNo) {

            case 0:

                validation = parameter.matches(pattern1);

                System.out.println("patternNo : "+patternNo+" : "+validation);

                break;

            case 1:

                validation = parameter.matches(pattern2);

                System.out.println("patternNo : "+patternNo+" : "+validation);

                break;

            case 2:

                validation = parameter.matches(pattern3);

                System.out.println("patternNo : "+patternNo+" : "+validation);

                break;

            case 3:

                validation = parameter.matches(pattern4);

                System.out.println("patternNo : "+patternNo+" : "+validation);

                break;

        }

        return validation;

    }

}



1. 자주 쓰이는 패턴


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을 나타냅니다.
    ex) ^[^a-zA-z]*$ 를 입력하면 영어는 아닌 문자를 의미합니다.
  • ( ) : 하나의 문자로 취급합니다. 
    ex) (abc) 패턴일 경우 : abc외에는 모두 false처리 됩니다. (abc)* 의 경우 abc의 반복을 제외하고 모두 false처리됩니다.
  • { } : 횟수 또는 길이를 나타내어줍니다.
  •  * : 이전 문자의 갯수의 제한을 두지 않습니다. *를 입력하지 않으면 개수를 1개로 인정하고 조건이 맞아도 문자 길이가 1를 넘어가면 false를 반환합니다.
  • + : 앞에 있는 정규식 형식이 1개가 꼭 들어가야 한다는 의미입니다..
  • \\d : \를 2개 붙이는 이유는 "\\d" 문자 안에서 \ 다음 \문자가 특수문자라고 알려주는 것과 같습니다. 이 형식을 사용하면 숫자만 true를 반환합니다.
    ex) ^[a-zA-Z]+\\d{2} 는 어떠한 값이 true를 반환할까?
    => ^시작열을 알리기에 앞에 a~Z까지 +로 인해 문자가 꼭 1개 들어가야 합니다.. 그리고 숫자 2개를 포함한다라고 해석 할 수 있습니다.


위의 코드를 통해 직접 테스트 하는 것이 가장 편할 것으로 생각합니다. 필요한 사항은 댓글로 남겨주시면 더 포스팅 하도록 하겠습니다.



## 참조 



Comments