코딩테스트에서 겪었던 문제입니다. 잊어버리지 않기 위해 포스팅합니다.

String[] split(String regex)

split 함수는 입력받은 정규표현식 또는 특정문자를 기준으로 문자열을 나누어 배열에 리턴합니다.

Split() 함수를 사용하며 주의할 점을 알아보자.
1
2
3
4
5
String s = "010-1234-5678";
String[] ar = s.split("-");
for(int i=0; i<ar.length; i++) {
	System.out.println(ar[i]);
}

특정문자 - 를 기준으로 문자열을 나누었고, 결과값은

1
2
3
010
7148
7707

이 나올 것입니다.

그렇다면,

1
2
3
4
5
String s = "127.0.0.1";
String[] ar = s.split(".");
for(int i=0; i<ar.length; i++) {
	System.out.println(ar[i]);
}

의 결과값이 어떻게 나올까?

1
2
3



결과값이 안나온다.

왜 이런 결과가 나오는 것일까?

그 이유는 split() 의 정의에 있다.

split 함수는 입력받은 정규표현식 또는 특정문자를 기준으로 문자열을 나누어 배열에 리턴합니다.

문자열을 나누려 했던 기준(delimeter)인 . 은 regex 정규식이기 때문입니다.

정규식에서 . 은 무작위의 한 글자를 나타내고, 그렇기 때문에 모든 문자가 delimeter로 인식되어 배열이 공백만 남게 되는 것이다.

그렇기 때문에 이것을 문자 자체의 .으로 인식시키려면 escapse sequence 문자인 \ 를 붙여서 해결할 수 있다. 추가적으로 여기서 \를 붙이려면 \ 자체도 escapse sequnce 문자를 붙여줘야한다.

그렇기 때문에 [ \\. ] 를 사용하면 [ \ . ] 로 인식하게 되고 이는 최종적으로 [ . ] 으로 인식하게 된다.

1
2
3
4
5
String s = "127.0.0.1";
String[] ar = s.split("\.");
for(int i=0; i<ar.length; i++) {
	System.out.println(ar[i]);
}

이렇게 해주었을 때의 결과는

1
2
3
4
127
0
0
1

와 같이 의도된 대로 출력할 수 있게 된다.