구분 기호를 사용하여 값을 분할하려고합니다. 하지만 놀라운 결과를 찾고 있습니다
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 값이 어디에 있든 관계없이 배열되어야합니다.
답변
split(delimiter)
기본적으로 결과 배열에서 후행 빈 문자열을 제거합니다. 이 메커니즘을 끄려면 다음 과 같이 음수 값 split(delimiter, limit)
으로 limit
설정된 오버로드 된 버전을 사용해야합니다.
String[] split = data.split("\\|", -1);
조금 더 자세한 내용 :
split(regex)
내부적 으로이 방법의 결과를 반환 하고이 방법 split(regex, 0)
에 대한 문서 에서 찾을 수 있습니다 (강조 광산)
이
limit
매개 변수는 패턴이 적용되는 횟수를 제어하므로 결과 배열의 길이에 영향을줍니다.한계
n
가 0보다 큰 경우 패턴은 최대 n-1 회까지 적용되며 배열의 길이는 n보다 크지 않으며 배열의 마지막 항목은 마지막으로 일치 한 구분자를 초과하는 모든 입력을 포함합니다.양수
n
가 아닌 경우 패턴은 가능한 한 여러 번 적용되며 배열의 길이는 얼마든지 가능합니다.경우
n
IS가 제로 그 패턴은 가능한 한 많이 적용되어, 어레이는 임의의 길이를 가질 수 있고, 빈 문자열 후행 폐기한다 .
예외 :
후행 빈 문자열을 제거하는 것은 그러한 빈 문자열이 분할 메커니즘에 의해 생성 된 경우에만 의미가 있습니다. 따라서 더 멀리 "".split(anything)
나눌 수 없으므로 ""
결과 [""]
배열로 표시됩니다.
이것은 스플릿이 발생하지 않았기 때문에 발생하므로 ""
비어 있지만 트레일은 스플릿 프로세스 로 생성 된 빈 문자열이 아닌 원래 문자열을 나타냅니다 .
답변
의 문서에서 String.split(String regex)
:
이 메소드는 주어진 표현식과 한계 인수가 0 인 두 인수 분할 메소드를 호출하는 것처럼 작동합니다. 따라서 후행 빈 문자열은 결과 배열에 포함되지 않습니다.
따라서 두 개의 인수 버전 String.split(String regex, int limit)
을 음수 값 으로 사용해야합니다 .
String[] split = data.split("\\|",-1);
문서:
한계 n이 0보다 크면 패턴이 최대 n-1 회까지 적용되며 배열의 길이는 n보다 크지 않으며 배열의 마지막 항목은 마지막으로 일치 한 구분자를 초과하는 모든 입력을 포함합니다. n이 양수가 아닌 경우 패턴은 가능한 한 여러 번 적용되며 배열의 길이는 얼마든지 가능합니다. n이 0이면 패턴이 가능한 한 여러 번 적용되고 배열의 길이가 길어질 수 있으며 후행 빈 문자열은 삭제됩니다.
이것은 후행 요소를 포함하여 빈 요소를 남기지 않습니다.
답변
부터 사항 String.split () API의 문서 :
주어진 정규 표현식과 일치하는 문자열을이 분할합니다. 이 메소드는 주어진 표현식과 한계 인수가 0 인 두 인수 분할 메소드를 호출하는 것처럼 작동합니다. 따라서 후행 빈 문자열은 결과 배열에 포함되지 않습니다.
오버로드 된 String.split (regex, int) 이 귀하의 경우에 더 적합합니다.
답변
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 내에 “, $”를 추가해야합니다.
답변
공백 문자, 쉼표, 세미콜론 등을 포함하여 여러 구분 기호가있을 수 있습니다. 다음과 같이 [] +를 사용하여 반복 가능한 그룹의 구분 기호를 사용하십시오.
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]+");
공백 문자를 구분 기호로 사용하는 경우를 대비하여 추가 된 공백 |