2018 KAKAO BLIND RECRUITMENT 1차 다트 게임 문제를 푸는 중 처음 알게되어서 정리해본다.
import java.util.regex.Pattern;
import java.util.*; 이 먹지 않는다... 이렇게 선언해주어야 함
'문자열 정규식'을 만들어주는 클래스
Pattern p = Pattern.compile("^[0-9]*$");
// p 는 숫자만 올 수 있는 패턴 정규식이 되었다.
가장 많이 사용하는 메소드는
Pattern.compile("패턴");
p.matcher(문자열);
boolean b = Pattern.matches("^[0-9]*$", "1234_hello_990");
// 숫자만으로 구성된 string이 아니므로 false 반환
이제 이 패턴을 어떻게 사용할 것인지는 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
m.find(문자열);
m.group();
m.group(1); // 그룹 중 1번에 해당하는 그룹을 object 형태로 반환
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)
}