String.split
(जो कॉल करता है Pattern.split
) का व्यवहार जावा 7 और जावा 8 के बीच बदलता है।
प्रलेखन
के प्रलेखन के बीच तुलना Pattern.split
में जावा 7 और जावा 8 , हम निम्नलिखित खंड का निरीक्षण जोड़ा जा रहा है:
जब इनपुट अनुक्रम की शुरुआत में एक सकारात्मक-चौड़ाई का मिलान होता है तो परिणामी सरणी की शुरुआत में एक खाली अग्रणी विकल्प शामिल होता है। शुरुआत में एक शून्य-चौड़ाई मैच हालांकि इस तरह के खाली अग्रणी विकल्प का उत्पादन कभी नहीं करता है।
जावा 7 की तुलना String.split
में जावा 8 में भी यही क्लॉज जोड़ा गया है ।
संदर्भ कार्यान्वयन
आइए हम Pattern.split
जावा 7 और जावा 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);
}
जावा 8 में निम्नलिखित कोड के अलावा इनपुट स्ट्रिंग की शुरुआत में शून्य-लंबाई मैच को बाहर करता है, जो ऊपर दिए गए व्यवहार की व्याख्या करता है।
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;
}
अनुकूलता बनाए रखना
जावा 8 और इसके बाद के संस्करण में व्यवहार
बनाने के लिए split
लगातार संस्करणों में और जावा 8 में व्यवहार के साथ संगत बर्ताव करता है:
- अपने रेगुलर एक्सप्रेशन से तो कर सकते हैं शून्य लंबाई स्ट्रिंग से मेल, बस जोड़ने
(?!\A)
पर अंत regex की और गैर कैप्चरिंग समूह में मूल regex लपेट (?:...)
(यदि आवश्यक हो)।
- यदि आपका रेगेक्स शून्य-लंबाई स्ट्रिंग से मेल नहीं खा सकता है , तो आपको कुछ भी करने की आवश्यकता नहीं है।
- यदि आप नहीं जानते कि रेगेक्स शून्य-लंबाई स्ट्रिंग से मेल खा सकता है या नहीं, तो चरण 1 में दोनों क्रियाएं करें।
(?!\A)
जाँच करता है कि स्ट्रिंग की शुरुआत में स्ट्रिंग समाप्त नहीं होती है, जिसका अर्थ है कि स्ट्रिंग की शुरुआत में मैच एक खाली मैच है।
जावा 7 और पूर्व में व्यवहार के बाद
split
जावा 7 और पूर्व के साथ पिछड़े-संगत बनाने के लिए कोई सामान्य समाधान नहीं है , split
अपने स्वयं के कस्टम कार्यान्वयन को इंगित करने के सभी उदाहरणों की जगह ।
s.split("(?!^)")
काम करने लगता है।