ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 정규표현식
    Java 2018. 1. 26. 01:21
    반응형

    문자열이 정해져 있는 형식(정규 표현식)으로 구성되어 있는지 검증해야 하는 경우가 있다. 예를 들어 이메일 등이다. 그것을 검증 하는 방법이 있다.

    정규 표현식 작성 방법

    기호
    설명

    [ ]

    한 개의 문자
    [abc]
    a,b,c중 하나의 문자
    [^abc]
    a,b,c 이외의 하나의 문자
    [a-zA-Z]
    a~z, A~Z중 하나의 문자
    \d
    한 개의 숫자,[0-9]와 동일
    \s
    공백
    \w
    한 개의 알파벳 또는 한 개의 숫자, [a-zA-Z_0-9]와 동일
    ?
    없음 또는 한 개
    *
    없음 또는 한 개 이상
    +
    한 개 이상
    {n}
    정확히 n개
    {n,}
    최소한 n개
    {n, m}
    n개에서부터 m개까지
    ( )
    그룹핑
    ^
    시작
    $


    이 표를 가지고 실습을 해보자
    다음은 02-123-1234 또는 010-1234-5678과 같은 전화번호를 위한 정규 표현식이다.
    (02|010)-\d{3,4}-\d{4}

    기호
    설명
    (02|010)
    02 또는 010
    -
    - 포함
    \d{3,4}
    3자리 또는 4자리 숫자
    -
    - 포함
    \d{4}
    4자리 숫자


    다음은 이메일을 위한 정규 표현식이다.

    \w+@\w+\. \w+(\.\w+)?

    기호
    설명
    \w+
    한 개 이상의 알파벳 또는 숫자
    @
    @
    \w+
    한 개 이상의 알파벳 또는 숫자
    \.
    .
    \w+
    한개 이상의 알파벳 또는 숫자
    (\.\w+)?
    \.\w+이 없거나 한 번 더 올 수 있음
    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
    public static void main(String[] args) {
            String regExp = "(02|010)-\\d{3,4}-\\d{4}";
            //escape 문자 \ 방지를 위해서 \\를 두개 써준다.
            String data = "010-1111-1234";
            boolean result = Pattern.matches(regExp, data);
            if(result)
            {
                System.out.println("정규식이 일치합니다.");
            }
            else
            {
                System.out.println("정규식이 일치하지 않습니다.");
            }
            
            regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
            data = "asdfnaver.com";
            result = Pattern.matches(regExp, data);
            if(result)
            {
                System.out.println("정규식이 일치합니다.");
            }
            else
            {
                System.out.println("정규식이 일치하지 않습니다.");
            }
     
    }
    Colored by Color Scripter

    와 같이 나오게 된다
    Pattern 클래스는 문자열의 정규표현식을 검사해준다.
    java.util.regex.Pattern 클래스의 정적 메소드인 matches() 메소드가 검증 하는 기능을 제공해준다.



    - 표현식

    ^ : 문자열의 시작

    $ : 문자열의 종료

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

    , \ 넣을 없음



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

    + : 문자가 하나 이상

    ? : 문자가 없거나 하나있음



    [] : 문자의 집합이나 범위를 나타내며 문자 사이는

    - 기호로 범위를 나타낸다.

    []내에서 ^ 선행하여 존재하면 not 나타낸다.



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

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

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



    \s : 공백 문자

    \S : 공백 문자가 아닌 나머지 문자

    \w : 알파벳이나 숫자

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

    \d : 숫자 [0-9] 동일

    \D : 숫자를 제외한 모든 문자

    \ : 정규표현식 역슬래시(\) 확장 문자

    역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고

    역슬래시 다음에 특수문자가 오면 문자 자체를 의미



    (?i) : 부분에 (?i) 라는 옵션을 넣어주면 대소문자를


    구분하지 않음



    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class PatternMatching {
    public static void main(String[] args) {
    String pattern = "";
    //pattern = "^\\S+\\.(pdf|txt|jpg)$"; //파일 확장자 구분
    //pattern = "^\\S+@\\S+.(com|co.kr|net)$"; // E-Mail
    //pattern = "^a"; // a로 시작하는 문자
    pattern = "^[0-9]+$"; // 숫자판별
    Pattern p = Pattern.compile(pattern);
    Scanner sc = new Scanner(System.in);
    while(true) {
    System.out.println("입력 ->");
    String input = sc.nextLine();
    Matcher m = p.matcher(input);
    if(m.matches()) { // find나 matches 둘다 boolean형태이고 패턴의 일치여부를 알 수 있다.
    System.out.println("통과 -> "+input);
    } else {
    System.out.println("잘못된 입력 -> "+input);
    }
    if(input.equals("x")) break;
    }
    sc.close();
    }
    }






    반응형

    'Java' 카테고리의 다른 글

    Java - Wait, Notify  (0) 2018.01.31
    Java - Thread  (0) 2018.01.30
    Java - Stack, Queue  (0) 2018.01.25
    Java - Map  (0) 2018.01.25
    Java - Collection  (0) 2018.01.25

    댓글

Designed by Tistory.