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
2020/12/17 - [Java] - [Java] 문자열 자르기 - StringTokenzer
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 문자열 자르기 - char형 구분자 (0) | 2020.12.30 |
---|---|
[Java] 문자열 자르기 - 정규표현식(split) (0) | 2020.12.28 |
[Java] 문자열 자르기 - StringTokenzer (0) | 2020.12.17 |
[Java] 문자열 자르기 - split (0) | 2020.12.16 |
[Java] 문자열 자르기 - substring (0) | 2020.12.12 |