জাভা 7 এবং জাভা 8 এর মধ্যে String.split
(যা কল করে Pattern.split
) এর আচরণ পরিবর্তন হয়।
নথিপত্র
ডকুমেন্টেশন মধ্যে তুলনা Pattern.split
মধ্যে জাভা 7 এবং জাভা 8 , আমরা নিম্নলিখিত দফা মান্য যোগ করা হচ্ছে:
ইনপুট ক্রমের শুরুতে যখন ইতিবাচক-প্রস্থের ম্যাচ হয় তখন ফলাফল অ্যারের শুরুতে একটি ফাঁকা শীর্ষস্থানীয় স্ট্রিং অন্তর্ভুক্ত করা হয়। শুরুতে একটি শূন্য-প্রস্থের ম্যাচ তবে কখনও এ জাতীয় শূন্যস্থানীয় স্ট্রিং তৈরি করে না।
একই ধারা এছাড়াও যোগ করা হয় String.split
এ জাভা 8 তুলনায় জাভা 7 ।
রেফারেন্স বাস্তবায়ন
আসুন Pattern.split
জাভা 7 এবং জাভা 8-তে রেফারেন্স বাস্তবায়নের কোডটি তুলনা করি The কোডটি গ্রেপকোড থেকে প্রাপ্ত হয়েছে, সংস্করণ 7u40-b43 এবং 8-b132 এর জন্য।
জাভা 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 আচরণ সঙ্গে সামঞ্জস্যপূর্ণ আচরণ করবে:
- আপনার Regex যদি পারেন শূন্য দৈর্ঘ্যের স্ট্রিং মেলে, শুধু যোগ
(?!\A)
সময়ে শেষ Regex ও অ ক্যাপচারিং দলের মূল Regex মোড়ানো (?:...)
(প্রয়োজন হলে)।
- যদি আপনার রেজেক্স শূন্য দৈর্ঘ্যের স্ট্রিংয়ের সাথে মেলে না , তবে আপনাকে কিছু করার দরকার নেই।
- রেজেক্স শূন্য-দৈর্ঘ্যের স্ট্রিংয়ের সাথে মেলে কিনা তা আপনি যদি না জানেন তবে পদক্ষেপ 1 এ দুটি ক্রিয়া করুন in
(?!\A)
স্ট্রিংটির শুরুতে স্ট্রিংটি শেষ হয় না তা পরীক্ষা করে, যা বোঝায় যে স্ট্রিংয়ের শুরুতে ম্যাচটি খালি ম্যাচ।
জাভা 7 এবং পূর্বের আচরণ অনুসরণ করা
split
জাভা with এর সাথে পশ্চাদপটে সামঞ্জস্যপূর্ণ করার কোনও সাধারণ সমাধান নেই এবং এর আগে, split
আপনার নিজস্ব কাস্টম প্রয়োগের দিকে নির্দেশ করার সমস্ত উদাহরণ প্রতিস্থাপনের সংক্ষিপ্ততা ।
s.split("(?!^)")
কাজ মনে হচ্ছে।