본문 바로가기
프로그래밍/자바

자바 문자열을 구분자로 분할하기 - split

by pentode 2019. 8. 6.

자바 언어에서 구분자로 연결된 문자열을 분할하는 방법을 알아봅니다. 예전에는 StringTokenizer 객체를 사용했었는데, JDK 1.4부터 split 메소드를 사용할 수 있습니다. 이게 훨씬 간편합니다.

 

split는 오버로딩 된 두 개의 메소드가 제공되며 정규식을 사용해서 문자열을 분할 합니다. 각각은 다음과 같습니다.

 

- String[] split(String regex) : 인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할합니다.

- String[] split(String regex, int limit) : 인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할 합니다. 두 번째 인자로 정규식을 적용하는 횟수를 제한할 수 있습니다.

 

분할할 구분자를 찾는데 정규식을 사용하므로 복잡한 형태의 구분자를 지정할 수 도 있지만 일반적으로 콤마, 개행문자 등 간단한 구분자를 주로 사용하게 되는것 같습니다.

 

콤마로 구분된 문자열을 분할하는 예를 보겠습니다.

 

package com.tistory.offbyone;

import java.util.Arrays;

public class SplitTest {
    public static void main(String[] args) {

        String str = "A,B,,C,D";
        String[] splited = str.split(",");

        System.out.println(splited.length);
        System.out.println(Arrays.toString(splited));

    }
}

결과)
5
[A, B, , C, D]

 

A, B, 빈문자열, C, D 다섯개로 분할되어 배열에 저장되었습니다.

 

실제로 많이 사용하는 구분자로는 파이프 기호(|)와 같은 실제 데이터에 잘 나오지 않는 문자입니다. 이런 구분자를 사용하여 분할 하기 위해서는 구분자로 사용되는 문자가 개개의 데이터에는 사용되지 않는다고 확신할 수 있어야 합니다. 그렇지 않으면 원하지 않는 결과를 얻게 되는 경우가 발생할 것입니다.

 

파이프 기호(|)를 구분자로 사용하게 되면 조금 문제가 발생하게 됩니다. 파이프 기호(|)는 정규식에서 특별한 의미를 가지는 메타문자입니다. 그러므로 이것은 단순 문자로 해석되지 않기 때문에 문제가 발생합니다.

 

String str = "A|B||C|D";
String[] splited = str.split("|");

System.out.println(splited.length);
System.out.println(Arrays.toString(splited));

결과)
8
[A, |, B, |, |, C, |, D]

 

구분자를 문자로 인식하지 못했기 때문에 한 문자씩 분할되어 버렸습니다. 이처럼 정규식 메타문자를 구분자로 사용하려고 할 경우에는 이스케이핑 해주어야 합니다.

 

String str = "A|B||C|D";
String[] splited = str.split("\\|");

System.out.println(splited.length);
System.out.println(Arrays.toString(splited));

결과)
5
[A, B, , C, D]

 

※ 참고 : 자바 정규식 메타문자 - ([{\^-=$!|]})?*+.

 

 

두 개의 인자를 가지는 split 메소드의 사용법을 알아보기 위해서 처음 예제를 조금 수정해서 실행시켜 보겠습니다.

 

String str = "A|B||C|D|";

String[] splited = str.split("\\|");

 

System.out.println(splited.length);

System.out.println(Arrays.toString(splited));

 

결과)

5

[A, B, , C, D]

 

이번 예제에는 마지막에 구분자가 하나 추가 되었습니다. 마지막에 값이 없는 빈 데이터가 있다는 것을 가정한 것입니다. 하지만 결과는 6이 아니라 5로 마지막 데이터가 무시되어 버렸습니다.

 

 

이제 두 번째 인자를 사용해서 실행을 해보겠습니다.

 

String str = "A|B||C|D|";

String[] splited = str.split("\\|", -1);

 

System.out.println(splited.length);

System.out.println(Arrays.toString(splited));

 

결과)

6

[A, B, , C, D, ]

 

이제는 원하는대로 여섯개의 데이터가 나오고 마지막에는 빈 문자열이 나옵니다.

 

split의 두번째 인자 int limit는 정규식이 적용될 횟수와 빈 문자열인 마지막 인자의 처리를 어떻게 할 지 지정할 수 있습니다.

 

- limit가 음수인 경우 : 찾는 패턴이 가능한한 최대로 적용되고 마지막 요소가 빈문자열일 경우 포함됩니다.

- limit가 0인 경우 : 찾는패턴이 가능한한 최대로 적용되고 마지막 요소가 빈문자열일 경우 버려집니다(이것이 두 번째 인자가 없을때 동작입니다).

- limit가 양수인 경우 : 찾는 패턴이 limit - 1회 적용됩니다. 배열의 길이는 limit보다 크지 않으며, 적용하고 남은 나머지 문자열 전체가 마지막 요소가 됩니다.

 

텍스트 파일로부터 읽은 데이터를 쪼개서 원하는 데이터로 만든 다든가, 데이터 전송을 위해서 구분자로 데이터를 붙여 전송한 후 받는 쪽에서 다시 분할 하는 등의 작업을 할 경우가 가끔씩 있습니다.

 

자바 언어에서 문자열을 구분자로 분할하는 split 메소드에 대해서 알아보았습니다.

 

반응형