이메일, 전화번호를 위한 정규식은 검색해서 써본적이 있는데 "//" 와 "\n" 사이의 문자를 구분해서 사용하는 것은 생각할때는 쉬웠는데 막상 생각해보니 그렇게 쉽지는 않았다.
Pattern과 Matcher는 공식 문서를 봐도 무슨 소린지 잘 모르겠고 블로그들을 찾아봐도 솔찍히 이해가 되지 않아서 간단한 코드로 제출했다.
public String[] customDelimiter(String input) {
int idx = input.indexOf("\\n");
String customDelimiter = input.substring(2, idx); // 구분자 추출
System.out.println("customDelimiter = " + customDelimiter);
String escapedDelimiter = Pattern.quote(customDelimiter);
return str.split(escapedDelimiter); // 이스케이프된 구분자로 분리
}
String escapedDelimiter = Pattern.quote(customDelimiter);
간단하게도 qoute 메서드 하나로 구분자가 잘 작동하게 되었다.
Pattern.qoute()는 특수 문잦가 포함된 문자열을 정규식으로 안전하게 사용할 수 있도록 해주는 메서드이다
자열을 정규식 패턴으로 사용할 때 특수 문자(., *, ?, [, ], (, ), {, }, |, ^, $, \ 등)가 있으면 예기치 않은 동작을 할 수 있는데,
Pattern.quote()를 사용하면 이러한 특수 문자를 일반 문자열로 처리할 수 있다.
그런데 구분자로 " \n " 이 들어갈때라던가
String customDelimiter = input.substring(2, idx);
String str = input.substring(idx + 2);
특히 저 두줄 코드가 너무 마음에 들지 않아 끝나고 1주일이 지났지만 마음에 안드는 부분을 바꿨다.
이해되지 않아도 이렇게 저렇게 하다보니 조금씩 이해가 됬고, 결국 지저분하게라도 바꾸긴 바꾸었다.
public String[] customDelimiter(String input) {
String result = "";
String START = "//";
String END = Pattern.quote("\\n");
Pattern pattern = Pattern.compile(START + "(.*?)" + END);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
String delimiter = matcher.group(1);
int idx = matcher.end();
String splitInput = input.substring(idx);
return splitInput.split(Pattern.quote(delimiter));
}
}
}
******* if (matcher.find()) { } 를 **무조건** 실행하여 true를 반환하고, *******
******* Matcher 객체는 해당 매칭 결과를 내부에 저장한다. *******
matcher.find() 메소드를 실행하지 않으면
Exception in thread "main" java.lang.IllegalStateException: No match found 가 발생한다.
덧셈할 문자열을 입력해 주세요.
//\t\n1\t2\t3
delimiter = \t
delimiter 로 \n을 넣었을때는 끝까지 성공하지 못했다.
'프리코스 > 1주차' 카테고리의 다른 글
Java 정규식, Pattern, Matcher (0) | 2024.10.30 |
---|---|
Git Commit Message Conventions 정리 (0) | 2024.10.24 |
pr 전 체크리스 (0) | 2024.10.18 |