우아한 테크코스 7기 백앤드 프리코스의 1주차 미션인 '문자열덧셈계산기'를 구현하기 위해서 문자 사이의 문자(커스텀 구분자)를 추출해야 해결할 수 있다고 생각하여, 문자 사이의 값을 추출할 방법을 찾아보니 정규표현식을 사용하여 문자를 추출할 수 있는 방법이 있었다.
Matcher matcher = Pattern.compile("정규표현식").matcher("문자열");
System.out.println(matcher.matches()); // true or false
기본적으로 Matcher와 Pattern을 사용한 정규표현식으로 문자열을 추출하려면 위와 같은 방법으로 사용이 된다.
compile("정규표현식") 인자의 정규표현식이 뒤에matcher("문자열") 인자의 문자열에 맞는 것이 있는지 Matcher 객체로 반환되고, matcher.matches()로 확인할 수 있다.
matcher.matches()는 맞는 문자열이 있으면 true를 반환하고, 없으면 false를 반환한다.
위의 방법으로 요구사항 중 하나인 //와 \n의 값을 추출하여 커스텀 구분자로 지정해줘야하는데
String s = "//;\n";
Matcher matcher = Pattern.compile("//(.)\n(.*)").matcher(s);
System.out.println(matcher.matches());
true
위처럼 코드로 선언 및 초기화한 문자열의 값은 잘 추출이 되는데
System.out.print("문자열을 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Matcher matcher = Pattern.compile("//(.)\n(.*)").matcher(s);
System.out.println(matcher.matches());
문자열을 입력하세요: //;\n
false
Scanner의 nextLine()으로 입력 받은 문자열은 이상하게 추출을 못하는 문제가 발생했다.
문제를 해결하기 위해 다양한 방법을 찾다가 정규표현식을 테스트 해볼 수 있는 좋은 사이트를 발견하게 되었다.
위 사이트에서 우선 내가 작성한 정규표현식이 올바른지 확인을 하였다.

위와 같이 테스트할 정규표현식과 밑에는 문자열 샘플들을 넣어주고 Test 버튼을 눌러주면 된다.

그럼 위의 사진의 1번처럼 문자열 샘플이 matches()가 되는지, find()가 되는지 group(0), group(1), group(2)까지 어떻게 되는지 결과가 나온다.
그리고 2번처럼 Java 문자열로 어떻게 해야되는지 나온다.
그럼 2번의 결과로 다시 테스트를 돌려준다.

그럼 위와 같이 matches()도 되고, find()도 되고, group(0), group(1), group(2)가 잘 나눠지는 것을 확인할 수 있었다.
System.out.print("문자열을 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Matcher matcher = Pattern.compile("//(.)\\n(.*)").matcher(s);
System.out.println(matcher.matches());
문자열을 입력하세요: //;\n
false
그래서 위와 같이 정규표현식을 //(.)\\n(.*)로 수정을 해줬는데도 어라..? 또 false가 나왔다..
"테스트를 확인해봤을 때는 잘 됐는데 왜 안되지?"하며 혹시 하는 마음으로 as a Java string의 결과로 나온 //(.)\\\\n(.*)를 넣어보기로 했다.
System.out.print("문자열을 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Matcher matcher = Pattern.compile("//(.)\\\\n(.*)").matcher(s);
System.out.println(matcher.matches());
문자열을 입력하세요: //;\n
true
그 결과 다행히 드디어 true가 출력되었고,
String delimiter = null;
System.out.print("문자열을 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Matcher matcher = Pattern.compile("//(.)\\\\n(.*)").matcher(s);
if (matcher.find()) {
delimiter = matcher.group(1);
s = matcher.group(2);
}
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
문자열을 입력하세요: //;\n1;2;3
;
1;2;3
위와 같이 find()와 group() 메소드를 활용하여, 커스텀 구분자도 추출하고, 검사할 문자열도 추출할 수 있게 되었다.