본문 바로가기
Java/Java

API) 문자열을 구분해주는 split, StringTokenizer

by 박채니 2022. 3. 25.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


☞ split

- 전달받은 문자열을 기준으로 문자열을 구분

 

① 하나의 구분자만 있을 때

String data = "apple banana cream desert egg";
		
String[] arr = data.split(" ");

for(String a : arr) {
	System.out.print("[" + a + "]"); 
}

@콘솔출력값
[apple][banana][cream][desert][egg]

"apple banana cream desert egg"를 공백(" ")을 기준으로 문자열을 나누어 String[]에 대입해주었습니다.

 

만약 문자열 내에 공백(" ")만 있는 것이 아니라 쉼표(,)도 섞여있으면 어떻게 해야할까요?

 

② 하나 이상의 구분자가 있을 때(정규표현식 사용)

String data = "apple,banana cream,desert egg";
		
String[] arr = data.split("[, ]");

for(String a : arr) {
	System.out.print("[" + a + "]"); 
}

@콘솔출력값
[apple][banana][cream][desert][egg]

regex(정규표현식)을 이용하여 구분자를 구분해줍니다.

[ ] 안은 하나의 문자를 의미하기 때문에 , 와 " "을 구분자로 사용해줍니다.

만약 (", ") 이렇게만 한다면 ", " 즉 쉼표+공백을 구분자로 인식하기 때문에 쉼표+공백의 문자열만 찾게 되는 것이죠.

String data = "apple,banana cream,desert egg";
		
String[] arr = data.split(", ");

for(String a : arr) {
	System.out.print("[" + a + "]"); 
}

@콘솔출력값
[apple,banana cream,desert egg]

split 입장에서는 ", " 쉼표+공백이 없다고 인식하여 분리해주지 않고 그대로 출력되는 것을 볼 수 있습니다.

 

③ 하나 이상의 구분자가 있을 때('|' 연산자 사용)

String data = "apple,banana cream,desert egg";
		
String[] arr = data.split(",| ");
		
for(String a : arr) {
	System.out.print("[" + a + "]"); 
}

@콘솔출력값
[apple][banana][cream][desert][egg]

 

다만 split은 문자열 분리 후 빈 문자열도 데이터로 인식해줍니다.

String data = "apple,banana cream,,,,,desert egg";
		
String[] arr = data.split("[, ]");
		
for(String a : arr) {
	System.out.print("[" + a + "]"); 
}

@콘솔출력값
[apple][banana][cream][][][][][desert][egg]

☞ StringTokenizer

- 전달 받은 문자열을 기준으로 문자열을 구분

- token이 빈 문자열이라면 버림

 

① 하나의 구분자만 있을 때

String data = "apple banana cream desert egg";
		
StringTokenizer tokenizer = new StringTokenizer(data, " ");

while(tokenizer.hasMoreElements()) {
	String token = tokenizer.nextToken();
	System.out.print("[" + token + "]");
}

@콘솔출력값
[apple][banana][cream][desert][egg]

data 중 " " 공백을 기준으로 문자열을 잘라달라고 하였고, while문을 이용하여 기준에 따라 잘린 token을 출력하였습니다.

(tokenizer.hasMoreElements()) tokenizer에서 남아있는 토큰이 있다면 true를 출력하므로 token을 모두 사용하면 false! while문을 탈출하게 됩니다.

token 참조변수에 tokenizer의 다음 token을 담아주고 출력해주었습니다.

 

② 하나 이상의 구분자가 있을 때

String data = "apple, banana cream,desert egg";
		
StringTokenizer tokenizer = new StringTokenizer(data, ", ");

while(tokenizer.hasMoreElements()) {
	String token = tokenizer.nextToken();
	System.out.print("[" + token + "]");
}

@콘솔출력값
[apple][banana][cream][desert][egg]

StringTokenizer는 split과 달리 구분자를 문자 단위로 처리하기 때문에 ", " 쉼표+공백을 하나의 구분자로 보는 것이 아니라

, 따로 " "(공백) 따로로 인식하여 쉼표와 공백을 구분자로 인식하여 처리해줍니다.

 

split과 달리 빈 문자열은 버리기 때문에 같은 data여도 다른 결과를 출력합니다.

String data = "apple,banana cream,,,,,desert egg";
		
StringTokenizer tokenizer = new StringTokenizer(data, ", ");

while(tokenizer.hasMoreElements()) {
	String token = tokenizer.nextToken();
	System.out.print("[" + token + "]");
}

@콘솔출력값
[apple][banana][cream][desert][egg]

 

 

데이터 분리하여 아래 처럼 출력해보기

당근 : 1000원
수박 : 5000원
배추 : 3000원

String data = "당근/1000,수박/5000,배추/3000";
		
//split 이용
String[] arr = data.split("[/,]");
for(int i = 0; i < arr.length; i++) {
	if(i % 2 == 0)
		System.out.println(arr[i] + " : " + arr[i+1] + "원");
}
System.out.println();
		
//StringTokenizer이용
StringTokenizer tokenizer = new StringTokenizer(data, "/,");
		
while(tokenizer.hasMoreElements()) {
	String token = tokenizer.nextToken();
	System.out.println(token + " : " + tokenizer.nextToken() + "원");
}

@콘솔출력값
당근 : 1000원
수박 : 5000원
배추 : 3000원

당근 : 1000원
수박 : 5000원
배추 : 3000원
LIST