Java | (파이프)로 Split 하지 않기?

문제

String metaValue = "abc|def|ghi";
String delimiter = "||";
        
// Using Split by org.apache.commons.lang3.StringUtils
String[]arr = StringUtils.split(metaValue, delimiter);
for(String str : arr) {
    System.out.println("val => " + str);
}
내가 원하는 것은 값에 ||(파이프 2개)가 포함된 경우, Split을 하는 것이다. 그런데, 파이프가 1개인 상황에서도 Split이 되는 것이 문제였다. split 메소드는 org.apache.commons.lang3.StringUtils 의 split 메소드를 사용했다. 그랬더니 결과는 abc / def / ghi 로 끊어져 버렸다. metaValue에는 문자열이 파이프 1개로 연결된 상황이기 때문에 split이 되는 것은 예상하지 못한 결과다.

해결 과정

1. escape 처리 시도

찾아보니 | 가 정규식으로 작동하는 걸 확인했다. Delimiter 를 escape 하기 위해 \|\| 로 변경해보기로 했다.
String metaValue = "abc|def|ghi";
String delimiter = "\\|\\|";

System.out.println("===================================");
// Using Split by org.apache.commons.lang3.StringUtils
String[]arr = StringUtils.split(metaValue, delimiter);
for(String str : arr) {
    System.out.println("val => " + str);
}

2. org.apache.commons.lang3.StringUtils 대신 StringTokenizer 로 변경 후 재시도

그런데 여전히 결과는 같았다. StringUtils의 문제일까 싶어서 StringTokenizer를 사용해봤다.
String metaValue = "abc|def|ghi";
String delimiter = "\\|\\|";
System.out.println("===================================");
// Using Split by java.util.StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(metaValue, delimiter);
while(tokenizer.hasMoreTokens()) {
    System.out.println("token => " + tokenizer.nextToken());
}

3. StringTokenizer 대신 String 클래스의 split 기능 사용

그래도 결과는 같았다. 그냥 String 클래스의 기본 split 메소드를 사용해보기로 했다.
String metaValue = "abc|def|ghi";
String delimiter = "\\|\\|";
System.out.println("===================================");
// Using Split by String class 
String[] split = metaValue.split(delimiter);
for(String s : split) {
    System.out.println("s => " + s);
}

결론

org.apache.commons.lang3.StringUtils 의 split 을 사용하면 | 에 escape 를 해도 의도와 다르게 split 될 수 있으므로 String 클래스의 기본 메소드를 쓰자.

One comment

  1. 머쩌유. 박수~~~~!짝짝짝x무제한

    응답

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다