Java 문자열 분할에서 빈 값이 제거되었습니다.


286

구분 기호를 사용하여 값을 분할하려고합니다. 하지만 놀라운 결과를 찾고 있습니다

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

8 개의 값을 얻을 것으로 예상됩니다. [5,6,7, EMPTY, 8,9, EMPTY, EMPTY] 하지만 6 개의 값만 받고 있습니다.

모든 아이디어와 해결 방법. EMPTY 값이 어디에 있든 관계없이 배열되어야합니다.

답변:


493

split(delimiter)기본적으로 결과 배열에서 후행 빈 문자열을 제거합니다. 이 메커니즘을 끄려면 다음 과 같이 음수 값 split(delimiter, limit)으로 limit설정된 오버로드 된 버전을 사용해야합니다.

String[] split = data.split("\\|", -1);

조금 더 자세한 내용 :
split(regex)내부적 으로이 방법의 결과를 반환 하고이 방법 split(regex, 0)에 대한 문서 에서 찾을 수 있습니다 (강조 광산)

limit매개 변수는 패턴이 적용되는 횟수를 제어하므로 결과 배열의 길이에 영향을줍니다.

한계 n0보다 큰 경우 패턴은 최대 n-1 회까지 적용되며 배열의 길이는 n보다 크지 않으며 배열의 마지막 항목은 마지막으로 일치 한 구분자를 초과하는 모든 입력을 포함합니다.

양수n아닌 경우 패턴은 가능한 한 여러 번 적용되며 배열의 길이는 얼마든지 가능합니다.

경우 nIS가 제로 그 패턴은 가능한 한 많이 적용되어, 어레이는 임의의 길이를 가질 수 있고, 빈 문자열 후행 폐기한다 .

예외 :

후행 빈 문자열을 제거하는 것은 그러한 빈 문자열이 분할 메커니즘에 의해 생성 된 경우에만 의미가 있습니다. 따라서 더 멀리 "".split(anything)나눌 수 없으므로 ""결과 [""]배열로 표시됩니다.
이것은 스플릿이 발생하지 않았기 때문에 발생하므로 ""비어 있지만 트레일은 스플릿 프로세스 로 생성 된 빈 문자열이 아닌 원래 문자열을 나타냅니다 .


2
와. 훌륭하게 작동했습니다. 그러나 -1 이것이 어떻게 모든 것을 바꾸는가?
Reddy

1
당신은 시도 할 수 있습니다data.split("\\|", 8)
Subhrajyoti Majumder

23
split("\\|", 8)처음 8 개의 토큰으로 제한되므로 사용하지 마십시오 ! 당신의 문자열 변수 인 경우, 당신은 사용해야 split("\\|", -1)은 토큰을 무제한으로 생성하고 그렇게 하지 않는 말에 버려진 빈 토큰을.
ADTC

2
@Reddy -1 ( 또는 실제로 음수는 중요하지 않습니다 )는 split 메소드에게 빈 토큰을 마지막에 유지하도록 지시합니다. 기본값은 0으로, 메소드가 배열의 끝에서 빈 토큰을 버리도록 지시합니다.
ADTC

8
많은 사람들이 후행을 빈 문자열로 유지하는 것이의 기본 기능이 될 것으로 예상했습니다 split(regex). 그들은 여기에서 끝나고 그렇지 않다는 것을 알았습니다.
Attila Tanyi

32

의 문서에서 String.split(String regex):

이 메소드는 주어진 표현식과 한계 인수가 0 인 두 인수 분할 메소드를 호출하는 것처럼 작동합니다. 따라서 후행 빈 문자열은 결과 배열에 포함되지 않습니다.

따라서 두 개의 인수 버전 String.split(String regex, int limit)을 음수 값 으로 사용해야합니다 .

String[] split = data.split("\\|",-1);

문서:

한계 n이 0보다 크면 패턴이 최대 n-1 회까지 적용되며 배열의 길이는 n보다 크지 않으며 배열의 마지막 항목은 마지막으로 일치 한 구분자를 초과하는 모든 입력을 포함합니다. n이 양수가 아닌 경우 패턴은 가능한 한 여러 번 적용되며 배열의 길이는 얼마든지 가능합니다. n이 0이면 패턴이 가능한 한 여러 번 적용되고 배열의 길이가 길어질 수 있으며 후행 빈 문자열은 삭제됩니다.

이것은 후행 요소를 포함하여 빈 요소를 남기지 않습니다.


4

부터 사항 String.split () API의 문서 :

주어진 정규 표현식과 일치하는 문자열을이 분할합니다. 이 메소드는 주어진 표현식과 한계 인수가 0 인 두 인수 분할 메소드를 호출하는 것처럼 작동합니다. 따라서 후행 빈 문자열은 결과 배열에 포함되지 않습니다.

오버로드 된 String.split (regex, int) 이 귀하의 경우에 더 적합합니다.


1
그것은 행동을 설명하지만 질문에 대답하지 않습니다.
assylias 2018 년

@assylias 지금 내 대답에 추가했습니다 :)
PermGenError

4

String[] split = data.split("\\|",-1);

항상 실제 요구 사항은 아닙니다. 위의 단점은 다음과 같습니다.

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8

데이터가 누락 된 경우 :

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8

데이터가 누락되었지만 실제 요구 사항은 길이가 7이어야합니다. 데이터베이스 또는 다른 것에 삽입해야 할 때와 같은 경우가 있기 때문입니다. 아래 접근법을 사용하여이를 달성 할 수 있습니다.

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7

내가 한 것은 "|"를 제거하는 것입니다. 끝에 파이프하고 문자열을 분할합니다. ","를 구분자로 사용하는 경우 replaceAll 내에 ", $"를 추가해야합니다.


1

공백 문자, 쉼표, 세미콜론 등을 포함하여 여러 구분 기호가있을 수 있습니다. 다음과 같이 [] +를 사용하여 반복 가능한 그룹의 구분 기호를 사용하십시오.

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

4 개의 토큰이 있습니다-a, b, c, d

이 스플릿을 적용하기 전에 소스 문자열의 선행 구분 기호를 제거해야합니다.

질문에 대한 답변으로 :

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

공백 문자를 구분 기호로 사용하는 경우를 대비하여 추가 된 공백 |

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.