자바 언어에서 구분자로 연결된 문자열을 분할하는 방법을 알아봅니다. 예전에는 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 메소드에 대해서 알아보았습니다.
'프로그래밍 > 자바' 카테고리의 다른 글
자바 정규식(Regular Expression) 사용하기 (0) | 2019.08.10 |
---|---|
자바 문자열에서 특정 문자를 다른 문자로 바꾸기 - replace, replaceAll, replaceFirst (0) | 2019.08.08 |
Jsoup을 사용한 화이트 리스트 방식의 XSS(Cross-Site Script)공격 방어 (4) | 2019.02.26 |
Java에서 JSON 문자열 생성 및 JSON 문자열을 자바 객체로 변환하기 (4) | 2019.01.18 |
Java에서 HashMap 복사하기 와 모든 키, 값을 리스트 하기 (0) | 2019.01.15 |