[Java] 문자열 자르기 - 여러 구분자/특수기호 사용하기

2020. 12. 21. 21:59프로그래밍 언어/Java

 

여러 구분자로 문자열 자르기

문자열을 분할할 때 구분자(delimiter)를 여러 개 사용하는 경우가 있습니다.

split 함수와 StringTokenizer 클래스를 사용하여 가능합니다.

 

먼저 split 함수부터 알아보도록 하겠습니다.

split 함수 파라미터로 구분자를 ,(쉼표), _(언더바),  (공백) 이렇게 3개를 넣어보도록 하겠습니다.

여러 구분자를 사용하려면 구분자들 사이에 |(파이프라인)을 넣어주시면 됩니다.

String str = "사과,배,귤_바나나_딸기 수박";
String[] results = str.split(",|_| ");

for (int i = 0; i < results.length; i++) {
	System.out.println("results[" +i + "] = " + results[i]);
}
        
 // 출력
results[0] = 사과
results[1] = 배
results[2] = 귤
results[3] = 바나나
results[4] = 딸기
results[5] = 수박

 

다음은 StringTokenizer 클래스를 사용한 예제입니다.

2번째 파라미터로 split과 동일하게 구분자들 사이에 |를 넣어주면 됩니다.

String str = "사과,배,귤_바나나_딸기 수박";
StringTokenizer st = new StringTokenizer(str, ",|_| ");
while (st.hasMoreElements())
{
	System.out.println(st.nextToken());
}

// 출력
사과
배
귤
바나나
딸기
수박

 

 

문자열을 분할할 때 특수문자 사용하기

StringTokenizer에서 문자열을 분할할 때 특수문자를 사용하면 문제 없이 잘 됩니다.

String str = "사과(배)귤,바나나,딸기,수박";
StringTokenizer st = new StringTokenizer(str, "(");
while (st.hasMoreElements())
{
	System.out.println(st.nextToken());
}

// 출력
사과
배)귤,바나나,딸기,수박

 

그러나, 문자열을 분할할 때 특수문자를 사용하고 싶은데 split 함수에서 사용하면 에러가 발생합니다.

split 함수에서 구분자를 정규표현식으로 받기 때문에 예약어로 사용한 특수문자는 에러가 발생합니다.

String str = "사과(배)귤,바나나,딸기,수박";
String[] results = str.split("(");

// 출력 에러
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1
(
	at java.base/java.util.regex.Pattern.error(Pattern.java:2029)
	at java.base/java.util.regex.Pattern.accept(Pattern.java:1879)
	at java.base/java.util.regex.Pattern.group0(Pattern.java:3063)
	at java.base/java.util.regex.Pattern.sequence(Pattern.java:2125)
	at java.base/java.util.regex.Pattern.expr(Pattern.java:2070)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1784)
	at java.base/java.util.regex.Pattern.<init>(Pattern.java:1431)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1070)
	at java.base/java.lang.String.split(String.java:2353)
	at java.base/java.lang.String.split(String.java:2400)
	at JavaPractice/string.Split2.main(Split2.java:9)

// 구분자를 ?를 사용했을 때의 출력 에러
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
?
^
	at java.base/java.util.regex.Pattern.error(Pattern.java:2029)
	at java.base/java.util.regex.Pattern.sequence(Pattern.java:2204)
	at java.base/java.util.regex.Pattern.expr(Pattern.java:2070)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1784)
	at java.base/java.util.regex.Pattern.<init>(Pattern.java:1431)
	at java.base/java.util.regex.Pattern.compile(Pattern.java:1070)
	at java.base/java.lang.String.split(String.java:2353)
	at java.base/java.lang.String.split(String.java:2400)
	at JavaPractice/string.Split2.main(Split2.java:9)

 

따라서, 에러가 발생하지 않고 특수문자 기준으로 문자열을 자르고 싶다면 \\를 특수문자 앞에 넣으면 됩니다.

String str = "사과(배)귤,바나나,딸기,수박";
String[] results = str.split("\\(");

for (int i = 0; i < results.length; i++) {
	System.out.println("results[" +i + "] = " + results[i]);
}
        
// 출력
results[0] = 사과
results[1] = 배)귤,바나나,딸기,수박

 

\\가 필요한 특수문자

\\를 사용해야 하는 대표적인 특수문자 목록입니다. 참고하세요.

| ? * ( ) [ ] { } \

 

split 함수에서 정규표현식을 사용하는 방법은 다음에 알아보도록 하겠습니다.

 

관련글:

2020/12/16 - [Java] - [Java] 문자열 자르기 - split

 

[Java] 문자열 자르기 - split

지난 시간에는 index를 지정하여 문자열을 자르는 substring을 알아보았습니다. 이번 시간에는 특정 문자를 지정하여 여러 개의 문자열로 자르는 split을 알아보도록 하겠습니다. 문자열 사과, 배, 귤

smartpro.tistory.com

 

2020/12/17 - [Java] - [Java] 문자열 자르기 - StringTokenzer

 

[Java] 문자열 자르기 - StringTokenzer

split 함수는 정규표현식을 알면 잘 사용할 수 있습니다. 오늘은 정규표현식을 사용하지 않고 더 빠른 속도로 문자열을 자를 수 있는 StingTokenizer를 소개해드리도록 하겠습니다. 속도가 빠르기 때

smartpro.tistory.com

 

반응형