본문 바로가기

Java

[Java] 정규표현식(Regular Expression)

 

정규표현식

 

특정한 규칙(패턴)을 가진 문자열의 집합을 표현하는데 사용되는 표현식 언어이다.


Meta 문자 정리

표현식 내용
  .x  "." 자리에 임의의 문자가 들어가며 x문자를 포함
  ^x 문자의 처음을 나타내고 x문자로 시작
x$ 문자의 끝을 나타내고 x문자로 끝
x* 바로 앞에 문자가 없거나 x문자가 0번 또는 한 번 이상 반복
x+ x문자가 반드시 한번 이상 반복
x? x문자가 없거나 있을 수 있음
[a-z] 알파벳 소문자가 포함된 모든 문자열 검색
[A-Z] 알파벳 대문자가 포함된 모든 문자열 검색
[0-9] 숫자가 포함된 모든 문자열 검색
[^ ] []안에 문자를 포함하지 않는 문자열 검색(부정)
x{n} x문자 n번 반복
x{n,} x문자 n번 이상 반복
x{n,m} x문자 n번 이상 m번 이하 반복
\w 알파벳과 숫자를 포함한 모든 문자열 검색 -> [a-zA-Z0-9]
\W 알파벳과 숫자를 제외한 모든 문자열 검색 -> [^a-zA-Z0-9]
\d 숫자가 포함된 모든 문자열 검색 -> [0-9]
\D 숫자를 제외한 모든 문자열 검색 -> [^0-9]
\s 공백을 의미
\S 공백이 아닌 문자를 의미

 

자바 API 정규표현식

java.util.regex

 

Pattern 클래스 메서드

static Pattern complie(String regex) : 입력한 정규표현식으로 패턴 생성

static Matcher matcher(CharSequence input) : 문자열이 패턴과 일치할 경우 true 반환

String pattern : 컴파일된 정규표현식 String타입으로 반환

String split(CharSequence input) : 패턴에 따라 문자열을 분리

Matcher 클래스 메서드

boolean matches() : 패턴과 문자열이 일치하면 true를 반환

boolean find() : 패턴과 문자열이 일치하는 경우 true를 반환

String group() : 매칭된 부분을 반환

String replaceAll(String replacement) : 패턴과 일치되는 부분을 replacement로 대체


 

  • 예제 코드
import java.util.Scanner;
public class RegularExam {
      public static void main(String[] args) {

          Scanner sc = new Scanner(System.in);
          System.out.println("문자열 입력 : ");
          String str = sc.nextLine();

          //abc문자 포함
          if(str.matches(".*abc.*")){
              System.out.println("매칭");
          } else {
              System.out.println("비매칭");
          }

          //숫자만 3자리 입력
          if(str.matches("[\\d]{3}")){
              System.out.println("매칭");
          } else {
              System.out.println("비매칭");
          }

          //알파벳, 숫자만 5자리 이상 
          if(str.matches("[\\w]{5,}")){
              System.out.println("매칭");
          } else {
              System.out.println("비매칭");
          }

          //한글 3~5자리 입력
          if(str.matches("[가-힣]{3,5}")){
              System.out.println("매칭");
          } else {
              System.out.println("비매칭");
          }

          //dolsam77@nate.com ==>매칭
          //32dolsam77@nate.com ==>비매칭
          //dolsam77nate.com ==>비매칭
          //dolsam77@nate.comcom ==> 비매칭
          if(str.matches("^[\\D]\\w+@\\w+.\\w{2,3}$")){
              System.out.println("매칭");
          } else {
              System.out.println("비매칭");
          }


          //이미지 파일 구별
          //abc.jpg , abc.gif , abc.png, abc.txt
          // (?i) ==> 소대문자 구분없이
          if(str.matches("^\\S+\\.(?i)(jpg|gif|png)$")){
              System.out.println("이미지파일");
          } else {
              System.out.println("일반파일");
       }



        예제코드(2)


import java.util.regex.Matcher;
import java.util.regex.Pattern;
 public class RegularExam2 {
      public static void main(String[] args) {

          String data[] = {
                  "bat", "bba", "bbg", "bonus",
                  "CA", "ca", "c232", "car",
                  "date", "dic", "diraaa"
          };

       Pattern pt = Pattern.compile("c[a-z]*");

       for(int i = 0; i <data.length; i++) {
           Matcher m = pt.matcher(data[i]);
           if(m.matches()) {
               System.out.println(data[i]);
           }
       }

          String source = "abc?de?fgh";
          String reg = "(\\w*)";  //그룹 괄호()로 표현

          Pattern p = Pattern.compile(reg);
          Matcher m = p.matcher(source);

          while(m.find()) {
              System.out.println(m.group());
          }

          String source2 = "HP:010-1111-1111, HOME:02-222-2222";
          String reg2 = "(0\\d{1,2}-\\d{3,4}-\\d{4})";
          Pattern p2 = Pattern.compile(reg2);
          Matcher m2 = p2.matcher(source2);

          while(m.find()) {
              System.out.println(m2.group());
          }
      }
    }