안녕하세요.
오늘은 자바에서 split을 사용하다 보면 정규식 문자를 구분자로 사용할 경우 발생하는 이슈와 에러 상황들에 대해 정리하려고 합니다.
split을 공부하다보니 생각보다 split에 구분자로 넣어주는 인자값이 일반 문자가 아닌 정규식 문자를 넣으면 어떤 결과들이 나오는지... 문득 궁금해져서 하나씩 테스트를 하면서 이렇게 정리를 하게 됐습니다. 그럼 바로 시작해 볼까요? :)
1. 이상없는 정규식 문자
` - = ~ ! @ % & _ ] } ; ' : " , / < >
우선 split 테스트를 했을 때 이상 없이 정상 처리가 됐던 특수 문자들입니다.
테스트 예제 소스 코드
package com.demo.system;
import java.util.Arrays;
import java.util.stream.Collectors;
public class TestMain {
public static void main(String[] args) {
System.out.println("--------------------------------------------------");
for (String regex : "`-=~!@%&_]};':\",/<>".split("")) {
splitTest("abcdefg", regex);
}
}
public static void splitTest (String originData, String regex) {
System.out.print(" " + regex + " 결과 : ");
try {
String regexData = Arrays.stream(originData.split("")).collect(Collectors.joining(regex));
String [] arr = regexData.split(regex);
int arrLength = arr.length;
for (int i = 0; i < arrLength; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(arr[i]);
}
} catch (Exception e) {
System.out.println(e);
}
System.out.println();
System.out.println("--------------------------------------------------");
}
}
위의 예제 소스를 보게 되면 테스트 대상 특수 문자 값들을 기준으로 for문을 돌면서 splitTest() 메서드를 호출하도록 작성하였습니다.
정규식 문자 기준 for문
for (String regex : "`-=~!@%&_]};':\",/<>".split("")) {
splitTest("abcdefg", regex);
}
splitTest() 메서드
1. split을 이용하여 테스트할 수 있도록 메서드를 만들어 줬습니다.
- 인자값 1 : split 대상 문자열
- 인자값 2 : split 구분값 (위의 메서드에서는 인자값 1과 join 처리를 하고 나서 split 처리를 하기 위한 용도)
2. 테스트로는 인자값1에 "abcdefg", 인자값 2에 "$" 값을 넣고 메서드를 호출하였습니다.
- "a$b$c$d$e$f$g"
3. 테스트 대상인 정규식 문자 기준으로 split 된 문자를 하나씩 나열합니다.
실행 결과
실행 결과는 위와 같이 이상없이 모두 정상 split이 되었습니다.
그럼 다음은 이상이 있는 정규식 문자를 기준으로 확인을 해보겠습니다.
2. 이상있는 정규식 문자
$ ^ | . * +? ( ) [ { \\
위의 정규식 문자들은 테스트를 했을 때 이슈가 있거나 에러가 발생한 문자들입니다.
위에서 테스트했던 소스 코드에서 테스트할 정규식 문자 값만 변경을 하였습니다.
정규식 문자 기준 for문
for (String regex : "$^|.*+?()[{\\".split("")) {
splitTest("abcdefg", regex);
}
실행 결과
이상이 있는 정규식 문자들은 위와 같이 결괏값이 다르거나 에러가 발생했습니다.
위처럼 에러가 발생을 하기 때문에 정규식 문자를 사용할 때에는 정규식 문자를 일반 문자로 인식할 수 있도록 "\\"(백슬래쉬)를 붙여주면 됩니다.
그러면 "\\"(백슬래쉬)를 붙이고 나서 결과가 어떤지 바로 확인해 보겠습니다.
"\\"를 추가하여 일반 문자로 split 처리
String [] arr = regexData.split("\\" + regex);
실행 결과
"\\"(백슬래쉬)를 붙여주고 일반 문자로 인식할 수 있도록 처리를 해줬더니 맨 처음 테스트했던 이상 없던 문자들의 결과와 같아졌습니다.
마무리
정규식 문자 | 이슈 내용 | 상세 내용 |
` - = ~ ! @ % & _ ] } ; ' : " , / < > | - | - |
$ ^ | 에러없이 결괏값이 다르게 나옴 (문자열 전체를 반환) | https://sancode.tistory.com/62 |
| | 에러없이 결괏값이 다르게 나옴 (""(공백) 기준으로 split 처리가 됨) | https://sancode.tistory.com/61 |
. | 에러없이 결괏값이 다르게 나옴 : \n (개행문자)를 제외한 모든 문자를 전부 split 처리하여 결괏값이 없음 | https://sancode.tistory.com/60 |
* + ? | 에러 발생 : Dangling meta character '' near index 0 | https://sancode.tistory.com/59 |
( | 에러 발생 : Unclosed group near index 1 | https://sancode.tistory.com/58 |
) | 에러 발생 : Unmatched closing ')' | https://sancode.tistory.com/57 |
[ | 에러 발생 : Unclosed character class near index 0 | https://sancode.tistory.com/56 |
{ | 에러 발생 : Illegal repetition | https://sancode.tistory.com/55 |
\\ | 에러 발생 : Unexpected internal error near index 1 | https://sancode.tistory.com/54 |
최종적으로 정규식 문자별로 이슈 & 에러가 발생하는 내용을 정리했습니다. 해당 내용에 대한 상세 정보는 우측에 각각 링크를 걸어두었습니다.
자바에서 split을 사용할 때 구분자를 정규식 문자를 사용할 땐 이상있는 문자든 이상이 없는 문자든 무조건 "\\"(백슬래쉬)를 붙여주는 게 좋을 것 같습니다.
그럼 오늘도 저의 작고 소중한 글을 읽어주셔서 감사합니다.

'Java > Java' 카테고리의 다른 글
자바 String StringBuffer StringBuilder 비교, 차이점 알아보기! (0) | 2023.01.29 |
---|---|
자바 천단위 콤마 찍기 (addComma) (0) | 2023.01.28 |
[java] 자바 split 파이프라인 "|" 검색하기 (0) | 2023.01.20 |
[java] 자바 split(".") 검색하는 방법과 주의사항 알아보기 (0) | 2023.01.19 |
[java] 자바 문법 에러 'Dangling meta character '' near index 0' 해결하기 (split 에러 이슈) (0) | 2023.01.18 |