split는 문자열을 나누는 메서드다.
String 문자열 = "가:나:다:가나다";
String[] 나눈배열 = 문자열.split(":");
//나눈배열 : {"가", "나", "다", "가나다"}
System.out.println(나눈배열[0]);
//결과 : 가
System.out.println(나눈배열[나눈배열.length-1]);
//결과 : 가나다
그런데 아래처럼 쓰면 작동을 안 한다.
String 문자열 = "가.나.다.가나다";
String[] 나눈배열 = 문자열.split(".");
이렇게 써야 한다.
String 문자열 = "가.나.다.가나다";
String[] 나눈배열 = 문자열.split("\\.");
그래야 작동한다.
이건 split의 인자로 들어가는 String 토큰이 regex 정규식이기 때문이다. 정규식에서 .은 무작위의 한 글자를 의미한다. 그러면 모든 문자가 토큰이 되기 때문에 배열에 남는 게 없게 되는 것이다.
따라서 이스케이프 문자를 앞에 붙여 줘야 한다. 그런데 String 안에 이스케이프 문자인 \를 써 주려면 \\라고 써 줘야 한다. 따라서 \\라고 쓰는 것이다. 그래서 \\.이라고 쓰면 정규식 쪽에서는 \.라고 인식을 하고 실제 .을 찾게 되는 것이다.
아악… 머리아프다. 여튼 기억하라. 기호를 써서 split를 쓸 때 뭔가 작동을 안 하면 \\을 붙여 보라.
참, 그냥 \라고만 붙여야 하는 것도 있는데, 아래 애들이다.
\b \t \n \f \r \” \’ \\
참고하면 될 것이다.
StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
실행결과
this
is
a
test
--------------------------------------------------------
[StringTokenizer 예시]
** Token의 타입은 String이다~!!
token의 갯수를 새고 싶을 땐 countTokens()메소드 이용한다.
import java.util.StringTokenizer;
public class AnalyzeSentence {
public static void main(String[] args){
AnalyzeSentence analyzer = new AnalyzeSentence();
String sentence = "I have the strangest feeling.";
int resultWithTrue = 0;
int resultWithFalse = 0;
resultWithTrue = analyzer.analyzeSentence(sentence, true);
resultWithFalse = analyzer.analyzeSentence(sentence, false);
System.out.println("결과 예상값 : 5, 실제 결과값 : "+resultWithTrue);
System.out.println("결과 예상값 : 29, 실제 결과값 : "+resultWithFalse);
}
public int analyzeSentence(String sentence, boolean isWord){
int count=0;
if( isWord == true){
StringTokenizer st = new StringTokenizer(sentence," ");
while( st.hasMoreTokens() ){
st.nextToken();
count++;
}
}else{
count = sentence.length();
}
return count;
}
}
출처 - http://blog.naver.com/ksgod10?Redirect=Log&logNo=50132576376
특정 Token을 이용해서 분리할 때,
대번에 생각나는 API는 역시 StringTokenizer가 아닐까??
Class StringTokenizer
The following is one example of the use of the tokenizer. The code:
StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
prints the following output:
is
a
test
StringTokenizer는
손쉽게 문자열을 특정 Token으로 분리하는 것이 가능하다.
하지만, StringTokenizer를 사용하다 보면, 다음과 같은 문제가 발생할 때가 있다.
아래와 같은 문자열을 분리한다고 하자
박찬호/35/LA다저스//한국
박찬호
35
LA다저스
한국
다음과 같은 문자열을 분리하는 경우르 보자.
source :
영어,한글,중국어,일어
boy,소년,,ボ―イ
output :
영어 -> boy
한글 -> 소년
중국어 -> ボ―イ
일어 -> null
StringTokenizer를 사용하면 상당히 귀찮은 노가다성 작업이 필요하게 된다..;;
위와 같은 경우 생략된 값을 처리할 좋은 방법이 없을까?
String class의 split() method를 사용해 보자..
String str = "boy,소년,,ボ―イ";
String[] output = str.split(",");
output :
boy
소년
ボ―イ
생략된 값까지 포함된 배열을 얻을 수 있으므로,
일단, 귀찮은 작업을 해주지 않아도 될꺼 같다..ㅋㅋ;
그럼 필드의 마지막이 생략된 경우는 어떨까??
영어,한글,중국어,일어,독어
boy,소년,,ボ―イ,
output :
영어 -> boy
한글 -> 소년
중국어 -> ""
일어 -> ボ―イ
독어 -> null
output1.length = 5
output2.length = 4
결과에 포함되지 않는 것을 알 수 있다..
JDK Document에서 String.split() method를 보면,
다음 두가지가 있음을 알 수 있다.
public String[] split(String regex, int limit)
String[] output = str.split(",", 5);
output :
영어 -> boy
한글 -> 소년
중국어 -> ""
일어 -> ボ―イ
독어 -> ""l
output.length = 5
limit값은 split()의 결과로 받게 되는
String[]의 크기를 나타내는 값이다.
결론 :
다수의 정형화된 문자열을 분리하는데는 StringTokenizer가 편리하지만
정형화 되지 않은 문자열을 분리하는 경우는 String.split()가 더 편리할 수 있다.
(노가다로 해줘야 하는 작업이 줄어든다..ㅋ;)
물론,
필드의 갯수가 엉망인 문자열을 분리하는데는 String.split()로도 부족하다..
'Development > Java' 카테고리의 다른 글
JVM 인코딩 설정(Dfile.encoding 옵션) (0) | 2012.03.13 |
---|---|
자바빈즈(javabeans) (0) | 2012.03.11 |
자바네트워크-UDP통신 (0) | 2012.03.08 |
Scanner 클래스를 이용한 문자열 입출력 예제 (0) | 2012.03.08 |
JAX-WS (Java API for XML WebService) (0) | 2012.02.29 |