728x90

개요

 

[백준, 1541번] 잃어버린 괄호 (Java)

문제설명입력 & 출력나의 풀이문제 접근 방법"백준 - 잃어버린 괄호"문제는 주어진 식에 적절히 괄호를 넣었을 때 최소의 값을 만드는 문제입니다.  연산자는 '+'와 '-'만 주어지기 때문에 최소

pixx.tistory.com

 

위 문제처럼 split() 메서드를 사용하여 지정한 구분자로 분리하려고 할 때 구분자가 "+"면 별도의 처리를 해줘야 합니다.

 

split("+")가 안 되는 이유

Java의 String.split() 메서드에서 "+"가 제대로 작동하지 않는 이유는 +정규식에서 특별한 의미를 가지는 메타문자이기 때문입니다.

 

정규표현식에서 :

'+'

  • 직전 패턴1회 이상 반복됨을 의미합니다.
  • "a+"는 "a", "aa", "aaa" 등을 매칭.

'-'

  • 특별한 의미가 없는 일반 문자로 취급됩니다.

 

에러 예시 확인해보기

public static void main(String[] args) {
    String input = "10+20+30+40";
    String[] numbers = input.split("+"); // 정규식 메타문자 '+'를 이스케이프 처리하지 않음
    for (String number : numbers) {
        System.out.println(number);
    }
}

 

 

해결방법

String[] num = number.split("\\+");  // '\\'를 사용해 이스케이프 처리

 

+를 문자열 그대로 처리하고 싶다면 백슬래시(\)를 사용하여 이스케이프 처리해야 합니다.

 

public class SplitEscapeExample {
    public static void main(String[] args) {
        String input = "10+20+30+40";
        String[] numbers = input.split("\\+"); // '+'를 이스케이프 처리
        for (String number : numbers) {
            System.out.println(number);
        }
    }
}

실행결과

10
20
30
40

 

이스케이프 처리가 필요한 메타문자 목록

문자 의미 예제
. 임의의 문자 (개행 제외) split("\\.")
* 0번 이상 반복 split("\\*")
+ 1번 이상 반복 split("\\+")
? 0 또는 1회 split("\\?")
^ 문자열의 시작 split("\\^")
$ 문자열의 끝 split("\\$")
{} 범위 또는 반복 횟수 split("\\{")
[] 문자 클래스 split("\\[")
() 그룹화 및 캡처 split("\\(")
` ` OR 연산
\ 이스케이프 문자 자체 split("\\\\")

 

정규식에서 메타문자로 사용되는 일부 문자는 이스케이프 처리가 필요합니다. 이런 문자들은 특별한 의미를 가지기 때문에 단순히 문자열로 취급하려면 앞에 \\를 붙여야 합니다.