[Java] 자바 정규 표현식 (Pattern, Matcher)

Fraise_KIM·2023년 6월 27일
0
post-custom-banner

1️⃣ 정규표현식 (Regular Expression) 이란?

  • 컴퓨터 과학의 정규언어로부터 유래한 것으로, 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언어
  • 입력값을 정해진 형식에 맞는지 검증할 때 사용 ex) 전화번호, 주민등록번호, 이메일 등 사용자가 그 형식대로 입력했는지 검증해야 하는 경우

2️⃣ 자주 사용하는 정규 표현식

정규 표현식숫자
^[0-9]*$숫자
^[a-zA-Z]*$영문자
^[가-힣]*$한글
\w+@\w+\.\w+(\.\w+)?이메일
^\d{2,3}-\d{3,4}-\d{4}$전화번호
\d{6} - [1-4]\d{6}주민등록번호
^\d{3}-\d{2}$우편번호

3️⃣ Pattern 클래스

  • 정규 표현식에 대상 문자열을 검증하는 기능
    • java.util.regex.Pattern 클래스의 matches()메소드 활용
  • matches() 메서드
    • 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열이다.

    • 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴한다.

      import java.util.regex.Pattern;
      
      public class RegexExample {
      	public static void main(String[] args)  {
          
                  String pattern = "^[0-9]*$"; //숫자만
                  String val = "123456789"; //대상문자열
              
                  boolean regex = Pattern.matches(pattern, val);
                  System.out.println(regex);
          }
      }

4️⃣ Pattern 클래스의 주요 메서드

  • compile(String regex) : 주어진 정규표현식으로부터 패턴을 만든다.
  • matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환한다.
  • asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성한다.
  • pattern() : 컴파일된 정규표현식을 String 형태로 반환한다.
  • split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리한다.

5️⃣ Matcher 클래스

  • Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용된다.
  • Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데, 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있다.
  • Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {
            Pattern pattern = Pattern.compile("^[a-zA-Z]*$"); //영문자만
            String val = "abcdef"; //대상문자열
	
            Matcher matcher = pattern.matcher(val);
            System.out.println(matcher.find());
	}
}

6️⃣ Matcher 클래스의 주요 메서드

  • matches() : 대상 문자열과 패턴이 일치할 경우 true 반환한다.
  • find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동한다.
  • find(int start) : start위치 이후부터 매칭검색을 수행한다.
  • start() : 매칭되는 문자열 시작위치 반환한다.
  • start(int group) : 지정된 그룹이 매칭되는 시작위치 반환한다.
  • end() : 매칭되는  문자열 끝 다음 문자위치 반환한다.
  • end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환한다.
  • group() : 매칭된 부분을 반환한다.
  • group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환한다.
  • groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환한다.

7️⃣ 유효성 검사

import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {
          String name = "홍길동";
          String tel = "010-1234-5678";
          String email = "test@naver.com";
         
          //유효성 검사
          boolean name_check = Pattern.matches("^[가-힣]*$", name);
          boolean tel_check = Pattern.matches("^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$", tel);
          boolean email_check = Pattern.matches("\\w+@\\w+\\.\\w+(\\.\\w+)?", email);

          //출력
          System.out.println("이름 : " + name_check);      // true
          System.out.println("전화번호 : " + tel_check);    // true
          System.out.println("이메일 : " + email_check);   // true
    }
}

8️⃣ 정규 표현식 문법

표현식설명
^문자열 시작
$문자열 종료
.임의의 한 문자 (단 ₩은 넣을 수 없음)
*앞 문자가 없을 수도 무한대로 많을 수도 있다.
+앞 문자가 하나 이상
?앞 문자가 없거나 하나 있다.
[ ]- 문자의 집합이나 범위를 나타낸다.
- 두 문자 사이는 - 기호로 범위를 나타낸다.
- [] 내에서 ^가 선행하여 존재하면 not을 나타낸다.
{ }횟수 혹은 범위를 나타낸다.
( )소괄호 안의 문자를 하나의 문자로 인식
정규표현식에서 ₩는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수 문자로 취급하고, 특수문자가 오면 그 문자 자체를 의미한다.)
₩b단어의 경계
₩B단어가 아닌 것에 대한 경계
₩A입력의 시작 부분
₩G이전 매치의 끝
₩Z입력의 끝이지만 종결자가 있는 경우
₩z입력의 끝
₩s공백 문자
₩S공백 문자가 아닌 나머지 문자
₩w알파벳이나 숫자
₩W알파벳이나 숫자를 제외한 문자
₩d숫자 [0-9]와 동일
₩D숫자를 제외한 모든 문자
(?!)앞 부분에 (?!) 옵션을 넣어주면 대소문자를 구분하지 않는다.

9️⃣ 예시 코드 ( java-next-step / ch2 )

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.apache.logging.log4j.util.Strings.isBlank;

public class StringCalculator {
    public int add(String text) {
        if(isBlank(text)) return 0;
        return sum(toInts(split(text)));
    }

    private boolean isBlank(String text) {
        return text == null || text.isEmpty();
    }

    private String[] split(String text) {
        Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text);
        if(m.find()) {
            String customDelimeter = m.group(1);
            return m.group(2).split(customDelimeter);
        }
        return text.split(",|:");
    }



📂 참고자료

https://coding-factory.tistory.com/529

post-custom-banner

0개의 댓글