문자열 구분자로 자르기

오늘·2021년 3월 25일
0

Java

목록 보기
30/42

문자열이 특정 구분자(delimiter)로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해서는

  1. String의 split() 메소드를 이용하거나
  2. java.util 패키지의 StringTokenizer 클래스를 이용할 수 있다

split()

String클래스를 보면 split 함수가 있다.

String[] 배열명 = 문자열.Split("구분할 특정 문자");

구분할 특정 문자는 정확히 정규 표현식이 들어간다. 정규 표현식을 매개값으로 제공하면 split() 메소드는 그 기호들을 구분자로 해서 부분 문자열을 추출한다.

아래는 반점(,) 을 구분자로 사용해본 예시이다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.println("입력 >>");
String str = br.readLine();
// 문자열을 반점(,) 기준으로 잘라 strArr 배열에 삽입
String[] strArr = str.split(",");
			
for (int i=0; i<strArr.length; i++) {
	System.out.println(strArr[i]);
}

StringTokenizer

: 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스이다. 그렇게 쪼개어진 문자열을 우리는 토큰(token)이라고 부른다
: StringTokenizer 객체를 생성할 때 첫 번째 매개값으로 전체 문자열을 주고, 두번째 매개값으로 구분자를 주면된다.

StringTokenizer st = new StringTokenizer("문자열", "구분자");

ex)
StringTokenizer st = new StringTokenizer(text, "/|,");

: 구분자 생략시 공백이 기본 구분자가 된다.
: StringTokenizer 객체가 생성되면 부분 문자열을 분리해 낼 수 있는데, 다음 메소드들을 이용해 전체 토큰 수, 남아있는 토큰 여부를 확인한 다음 토큰을 읽으면 된다.

// public StringTokenizer(String str,String delim);
// 특정 delim으로 문자열을 분리
StringTokenizer st = new StringTokenizer(text, "/|,");
int countTokens = st.countTokens();
for(int i=0; i<countTokens; i++) {
	// 토큰 꺼내서 사용하기
	String token = st.nextToken();
	System.out.println(token);
}
		
// 남은 토큰이 있는지 확인하기
System.out.println(st.hasMoreTokens());
		
// 토큰이 없음
System.out.println();
		
// 다시 토큰을 만들자
st = new StringTokenizer(text, "/");
System.out.println(st.hasMoreTokens());
		
// 돌리면서 다시 실행해주기
while( st.hasMoreTokens() ) {
	String token = st.nextToken();
	System.out.println(token);
}

실행 결과


그럼 split이랑 Token이 뭐가 다르지?

  1. split은 리턴이 배열로 나오며, 정확히 구분자를 써 줘야 한다.

: 구분자를 정확히 지정해줘야 한다는 게 순서도 중요하다. -=를 구분하고 싶다면 -= 혹은 - 혹은 = 라는 것을 하나하나 지정해 주어야 하고, -=를 먼저 지정해 주어야 원하는 대로 출력되는 것을 확인 할 수 있다.

String str = "홍길동-=영문과-100=90";

// 구분자를 제대로 적어줬을때
String[] ss = {"이름", "학과", "중간고사", "기말고사"};
// 아래와 같이 하나하나 지정해 준다면 상관 없지만
String[] split1 = str.split("-=|-|=");
for(int i=0;i<ss.length;i++){
	System.out.print(ss[i] + " : ");
	System.out.println(split1[i]);
}
		
System.out.println();
		
// 아래와 같이 구분자를 지정한다면 출력 결과가 원하는 대로 나오지 않을 수 있다.
String[] split2 = str.split("-|=|-=");
for(int i=0;i<ss.length;i++){
	System.out.print(ss[i] + " : ");
	System.out.println(split2[i]);
}
System.out.println();
		
String[] split3 = str.split("-|=");
for(int i=0;i<ss.length;i++){
	System.out.print(ss[i] + " : ");
	System.out.println(split3[i]);
}

실행 결과

  1. StringTokenizer은 구분자 소모성으로 구분되며, 구분자를 엄격하게 지정하지 않아도 된다.
    : 코드를 확인해 보면 반점(,) 혹은 슬래쉬(/) 를 구분자로 지정해 주었더니 함께 있는 ,/ 역시도 무리없이 구분되는 모습을 확인 할 수 있다.
String txt = "고길동,/컴퓨터과,100/90";
		
// 토큰은 리턴이 각각 문자열로 나온다
StringTokenizer st = new StringTokenizer(txt, ",|/");
		
String name = st.nextToken();
String dept = st.nextToken();
String midScore = st.nextToken();
String finScore = st.nextToken();
		
System.out.println("이름 : " + name);
System.out.println("학과 : " + dept);
System.out.println("중간고사 점수 : " + midScore);
System.out.println("기말고사 점수 : " + finScore);
// 토큰이 남아있지 않으면 출력 에러가 발생한다
// String nullspace = st.nextToken();
// System.out.println("나오나? : " + nullspace);

실행 모습

이름 : 고길동
학과 : 컴퓨터과
중간고사 점수 : 100
기말고사 점수 : 90

0개의 댓글