String.split
(를 호출하는 Pattern.split
) 동작은 Java 7과 Java 8간에 변경됩니다.
선적 서류 비치
의 문서 사이의 비교 Pattern.split
에 자바 (7) 와 자바 (8) , 우리는 다음과 같은 조항을 준수하는 것은 추가되는 :
입력 시퀀스의 시작 부분에 양의 너비가 일치하는 경우 결과 배열의 시작 부분에 빈 선행 부분 문자열이 포함됩니다. 그러나 처음에 너비가 0 인 일치는 이러한 빈 선행 하위 문자열을 생성하지 않습니다.
같은 절은 또한 추가 String.split
로 자바 (8) 에 비해, 자바 7 .
참조 구현
Pattern.split
Java 7과 Java 8에서 참조 구현 코드를 비교해 보겠습니다 . 코드는 버전 7u40-b43 및 8-b132에 대해 grepcode에서 검색됩니다.
자바 7
public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};
// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
}
자바 8
public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
if (index == 0 && index == m.start() && m.start() == m.end()) {
// no empty leading substring included for zero-width match
// at the beginning of the input char sequence.
continue;
}
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};
// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
}
Java 8에서 다음 코드를 추가하면 위의 동작을 설명하는 입력 문자열의 시작 부분에서 길이가 0 인 일치 항목이 제외됩니다.
if (index == 0 && index == m.start() && m.start() == m.end()) {
// no empty leading substring included for zero-width match
// at the beginning of the input char sequence.
continue;
}
호환성 유지
Java 8 이상에서 다음 동작
확인하려면 split
지속적으로 자바 8의 행동 버전에서 호환 동작합니다을 :
- 당신의 정규식이 경우 수있는 길이가 0 인 문자열과 일치, 다만 추가
(?!\A)
에 마지막 정규식의 비 캡처 그룹의 원래 정규식 포장 (?:...)
(필요한 경우).
- 정규식 이 길이가 0 인 문자열과 일치 할 수없는 경우 아무것도 할 필요가 없습니다.
- 정규식이 길이가 0 인 문자열과 일치 할 수 있는지 여부를 모르는 경우 1 단계의 두 작업을 모두 수행하십시오.
(?!\A)
문자열이 문자열의 시작 부분에서 끝나지 않는지 확인합니다. 이는 일치 항목이 문자열의 시작 부분에서 비어 있음을 의미합니다.
Java 7 및 이전 버전에서 다음 동작
split
Java 7 및 이전 버전과의 역 호환성 을 만드는 일반적인 솔루션은 없습니다. 모든 인스턴스를 split
사용자 정의 구현 으로 바꾸는 것보다 부족 합니다.
s.split("(?!^)")
작동하는 것 같습니다.