[JAVA] 문자열 정규식 Pattern, Matcher

mango·2023년 9월 9일
0

JAVA

목록 보기
7/10
post-thumbnail

  • 문자열이 숫자인지, 알파벳인지, 특수문자인지 등을 판별해주는 Pattern, Matcher 클래스

2018 KAKAO BLIND RECRUITMENT 1차 다트 게임 문제를 푸는 중 처음 알게되어서 정리해본다.

import java.util.regex.Pattern;

import java.util.*; 이 먹지 않는다... 이렇게 선언해주어야 함

📌 Pattern

'문자열 정규식'을 만들어주는 클래스

Pattern p = Pattern.compile("^[0-9]*$");
// p 는 숫자만 올 수 있는 패턴 정규식이 되었다.

가장 많이 사용하는 메소드는

  1. Pattern.compile()
Pattern.compile("패턴");
  1. Pattern.matcher()
    문자열을 패턴에 매칭하는 메소드
p.matcher(문자열);
  1. Pattern.matches()
    문자열이 패턴에 맞는지 결과를 bool 형태로 반환
boolean b = Pattern.matches("^[0-9]*$", "1234_hello_990"); 
// 숫자만으로 구성된 string이 아니므로 false 반환

이제 이 패턴을 어떻게 사용할 것인지는 Matcher 클래스의 메소드를 활용한다.

📌 Matcher

Pattern 클래스를 다양하게 활용할 수 있는 메소드를 가지는 클래스

String str = "mia1234@google.com";
Pattern p = Pattern.compile("^[0-9]*$");
Matcher m = p.matcher(str);

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

// 결과는 
1
2
3
4
  1. Matcher.find()
    매칭되는 것이 있으면 true 없으면 false
m.find(문자열);
  1. Matcher.group()
    패턴에 일치하는 것을 그룹으로 만든 것
m.group();
m.group(1); // 그룹 중 1번에 해당하는 그룹을 object 형태로 반환
  1. Matcher.groupCount()
    패턴에 일치하는 그룹의 갯수
m.groupCount();

* 정규식 패턴 종류

종류기호비고(예시)
그룹()([0-9]+)([SDT])([*#]?) : 이렇게 종류를 나누기
문자셋[]
시작^
$
zero or one?[*#]? : *, #이 들어올 수 있지만 없을 수도 있음
zero or many*
one or many+
숫자[0-9][0-9]+ : 10이상 몇자리의 숫자도 다 커버가능
알파벳 소문자[a-z][a-zA-Z] : 모든 알파벳 가능
한글[가-힣]^[ㄱ-ㅎ|가-힣]*$ : 한글만 허용
특정 글자수{숫자}^[0-9]{6}-[1-4][0-9]{6}+$ : 주민등록번호에 대한 정규식

* 코드 예시

dartResult = "1D2S#10S*"
Pattern p = Pattern.compile("([0-9]+)([SDT])([*#]?)");
Matcher m = p.matcher(dartResult);


while(m.find()){
	System.out.println(m.group());
} 
// 1D, 2S#, 10S* 이렇게 세개가 return됨


while(m.find()){
	System.out.println(m.group(1));
    
    int num = Integer.valueOf(m.group(1));
    //String이기 때문에 Integer.valueOf 함수로 변환 필요
    
    char sdt = m.group(2).charAt(0);
	//String이기 때문에 charAt(0) 으로 변환 필요
    
    char bonus = m.group(3).charAt(0);
    //3번째 값은 있을수도 없을수도 있음 (없으면 null)
} 

* (참고) 자바 정규식 테스트 홈페이지

regexplanet 정규식 테스트

profile
앎의 즐거움을 아는 나는 mango ♪

0개의 댓글