উত্তর:
ইন java.lang.String
, replace
পদ্ধতি পারেন গৃহস্থালির কাজ এর একজোড়া বা একজোড়া লাগে CharSequence
(যার মধ্যে স্ট্রিং একটি উপশ্রেণী তাই এটি আনন্দের সাথে STRING এর একজোড়া নেব) 'র। replace
পদ্ধতি একটি গৃহস্থালি বা এর সমস্ত সংঘটন প্রতিস্থাপন করবে CharSequence
। অন্যদিকে, উভয় String
আর্গুমেন্ট replaceFirst
এবং replaceAll
রেগুলার এক্সপ্রেশনের (Regex) হয়। ভুল ফাংশন ব্যবহার করে সূক্ষ্ম বাগগুলি হতে পারে।
String#replace(target, replacement)
একই জিনিসটি ব্যবহার করেন, এটি স্ট্রিংয়ের উদ্ধৃতি ব্যতীত: এর চেয়ে দ্রুততর হওয়ার Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
কোনও কারণ আছে কি ? কেবল অতিরিক্ত ক্রিয়াকলাপ সম্পাদন করার পরে এটি এটিকে মনে হবে না । String#replace
String#replaceAll
String#replace
replaceAll
। উত্তরটি সম্পর্কে আরওreplace
প্রশ্ন:java.lang.String
পদ্ধতিগুলির মধ্যে পার্থক্য কী replace()
এবং replaceAll()
পরবর্তী সময়ে রেজেক্স ব্যবহার করে।
উত্তর: কেবলমাত্র রেজেক্স তারা উভয়ই প্রতিস্থাপন :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
পুনশ্চ:
এছাড়াও একটি আছে replaceFirst()
(যা একটি রেজেক্স লাগে)
CharSequence
হয়। উভয় replace()
এবং replaceAll()
"সাথে কাজ CharSequence
"। এটি দেওয়াটিকে একটি নিয়মিত প্রকাশ হিসাবে replaceAll()
বিবেচনা করে CharSequence
তাই এটি রেগেক্স ম্যাচগুলির সন্ধান করে , প্রদত্তটিকে একটি সরল অনুসন্ধান পাঠ হিসাবে replace()
বিবেচনা করে CharSequence
যাতে এটি এর উপস্থিতিগুলির জন্য অনুসন্ধান করে।
উভয় replace()
এবং replaceAll()
স্ট্রিং সমস্ত উপস্থিতি প্রতিস্থাপন।
পার্থক্য বোঝার জন্য আমি সবসময় উদাহরণগুলি সহায়ক বলে মনে করি।
replace()
replace()
আপনি যদি কেবল কিছুটিকে char
অন্যের সাথে char
বা কিছুটিকে String
অন্যের সাথে String
(বাস্তবে CharSequence
) প্রতিস্থাপন করতে চান তবে ব্যবহার করুন ।
উদাহরণ 1
চরিত্রের সমস্ত উপস্থিতি এর x
সাথে প্রতিস্থাপন করুন o
।
String myString = "__x___x___x_x____xx_";
char oldChar = 'x';
char newChar = 'o';
String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
উদাহরণ 2
স্ট্রিংয়ের সমস্ত উপস্থিতি এর fish
সাথে প্রতিস্থাপন করুন sheep
।
String myString = "one fish, two fish, three fish";
String target = "fish";
String replacement = "sheep";
String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
replaceAll()
replaceAll()
আপনি যদি নিয়মিত প্রকাশের প্যাটার্ন ব্যবহার করতে চান তবে ব্যবহার করুন ।
উদাহরণ 3
কোনও সংখ্যার সাথে একটি প্রতিস্থাপন করুন x
।
String myString = "__1_6____3__6_345____0";
String regex = "\\d";
String replacement = "x";
String newString = myString.replaceAll(regex, replacement);
// __x_x____x__x_xxx____x
উদাহরণ 4
সমস্ত সাদা স্থান সরান।
String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat ";
String regex = "\\s";
String replacement = "";
String newString = myString.replaceAll(regex, replacement);
// HorseCowCamelSheepGoat
নথিপত্র
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
নিয়মিত অভিব্যক্তি
replace()
পদ্ধতি উভয় একটি আদিম গ্রহণ করতে ওভারলোড হয় char
এবং একটি CharSequence
আর্গুমেন্ট হিসাবে।
এখন যতটা পারফরম্যান্স সম্পর্কিত, তত্ক্ষণিক পদ্ধতিটি আরও replace()
দ্রুততর replaceAll()
কারণ দ্বিতীয়টি প্রথমে রেজেক্স প্যাটার্নটি সংকলন করে এবং শেষ পর্যন্ত প্রতিস্থাপনের আগে মেলে যেখানে প্রাক্তন কেবল সরবরাহিত যুক্তির সাথে মেলে এবং প্রতিস্থাপন করে।
যেহেতু আমরা জানি রেজেক্স প্যাটার্নের মিলটি কিছুটা জটিল এবং ফলস্বরূপ ধীর হয়, তখনই যখন সম্ভব সম্ভব হয় তার চেয়ে replace()
বেশি পছন্দ করা replaceAll()
উচিত।
উদাহরণস্বরূপ, আপনার উল্লেখ করা সহজ বিকল্পগুলির জন্য, ব্যবহার করা ভাল is
replace('.', '\\');
পরিবর্তে:
replaceAll("\\.", "\\\\");
দ্রষ্টব্য: উপরের রূপান্তর পদ্ধতির যুক্তিগুলি সিস্টেম-নির্ভর।
Pattern.compile(...)
তাদের বাস্তবায়নের বিষয়বস্তু / অংশের উপস্থিতির replace
জন্য প্রথম যুক্তিটি কীভাবে সংজ্ঞায়িত / প্রেরণ করবেন সে সম্পর্কে কম জটিল বলে মনে হয়। এটি প্রয়োজন হয় না "\"
। উপরন্তু replace
জাভা যেহেতু পাওয়া যায় 1.5
এবং replaceAll
যেহেতু1.4
String replace(char oldChar, char newChar)
এই স্ট্রিংয়ে পুরানোচরের সমস্ত উপস্থিতিগুলিকে নতুনচর দিয়ে প্রতিস্থাপনের ফলে নতুন স্ট্রিং প্রদান করে।
String replaceAll(String regex, String replacement
এই স্ট্রিংয়ের প্রতিটি স্ট্রিং প্রতিস্থাপন করে যা প্রদত্ত প্রতিস্থাপনের সাথে প্রদত্ত নিয়মিত প্রকাশের সাথে মেলে।
এটি সত্য নয় যে প্রতিস্থাপন () রিপ্লেসমএল () এর চেয়ে দ্রুত কাজ করে যেহেতু উভয়ই এর প্রয়োগের ক্ষেত্রে একই কোড ব্যবহার করে
Pattern.compile (Regex) .matcher (এই) .replaceAll (প্রতিস্থাপন);
এখন প্রশ্ন হ'ল প্রতিস্থাপন কখন ব্যবহার করতে হবে এবং কখন প্রতিস্থাপন (সমস্ত) ব্যবহার করতে হয় use আপনি যখন স্ট্রিংয়ের উপস্থিতিগুলির স্থান নির্বিশেষে কোনও স্ট্রিংকে অন্য একটি স্ট্রিংয়ের সাথে প্রতিস্থাপন করতে চান তখন প্রতিস্থাপন () ব্যবহার করুন। তবে আপনার যদি কিছু নির্দিষ্ট পছন্দ বা শর্ত থাকে তবে স্ট্রিংয়ের শুরু বা শেষে কেবল সেই সাবস্ট্রিংগুলি প্রতিস্থাপন করুন প্রতিস্থাপন ব্যবহার করুন ()। আমার বক্তব্য প্রমাণ করার জন্য এখানে কয়েকটি উদাহরণ দেওয়া হল:
String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
replace
কল না Pattern.compile(regex).matcher(this).replaceAll(replacement);
। এটি কল করেPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
উইকডির উত্তরে ইঙ্গিত করা হয়েছে, প্রতিস্থাপনের সাথে প্রতিস্থাপনের স্ট্রিং প্রতিস্থাপন এবং রিপ্লেসমএল এর মধ্যে আলাদাভাবে পরিচালনা করা হয়। আমি একটি [3] এবং একটি [4] একই মান হিসাবে প্রত্যাশা করেছি, তবে সেগুলি আলাদা।
public static void main(String[] args) {
String[] a = new String[5];
a[0] = "\\";
a[1] = "X";
a[2] = a[0] + a[1];
a[3] = a[1].replaceAll("X", a[0] + "X");
a[4] = a[1].replace("X", a[0] + "X");
for (String s : a) {
System.out.println(s + "\t" + s.length());
}
}
এর ফলাফল:
\ 1
X 1
\X 2
X 1
\X 2
এটি পারল থেকে পৃথক যেখানে প্রতিস্থাপনের জন্য অতিরিক্ত স্তরের পালানোর প্রয়োজন হয় না:
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
যা এক্স 2 প্রিন্ট করে
এটি বেশ উপদ্রব হতে পারে, যেমন জাভা.এসকিএল.ডাটাবেসমেটাডাটা.জেটসন্ধান স্ট্রিংইস্প্যাক্ট () রিপ্লেসএল () সহ ফিরিয়ে দেওয়া মানটি ব্যবহার করার চেষ্টা করার সময়।
পুরানো থ্রেডটি আমি জানি তবে আমি জাভাতে একরকম নতুন এবং এর মধ্যে একটি অদ্ভুত জিনিস আবিষ্কার করি। আমি ব্যবহার করেছি String.replaceAll()
তবে অবিশ্বাস্য ফলাফল পেয়েছি ।
এই স্ট্রিং আপ এর মত কিছু:
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
তাই আমি একটি অদ্ভুত সমস্যা কাছাকাছি পেতে এই ফাংশনটি ডিজাইন করেছি:
//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s )
{
if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
{ return s; }
while( (s != null) && (s.indexOf( s1 ) >= 0) )
{ s = s.replace( s1, s2 ); }
return s;
}
যা আপনাকে এটি করতে সক্ষম করে:
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );
String.replaceAll()
আক্ষরিক যুক্তি হিসাবে নিয়মিত প্রকাশগুলি প্রত্যাশা করে , এজন্যই আপনি "অনাকাঙ্ক্ষিত" (যা সত্যিই খুব বেশি অনুমানযোগ্য) ফলাফল পান। String.replace()
আপনি চান ভাবে কাজ করে।
ইতিমধ্যে নির্বাচিত "সেরা উত্তর" (এবং সুরাগের মতো আরও ভাল) এর সাথে যুক্ত করার জন্য, ক্রমযুক্ত String.replace()
অক্ষরগুলি প্রতিস্থাপনের দ্বারা আবদ্ধ করা হয়েছে (এভাবে নেওয়া হচ্ছে CharSequence
)। তবে String.replaceAll()
কেবলমাত্র ক্রমিক অক্ষরগুলি প্রতিস্থাপন করে বাধা হয় না। আপনার নিয়মিত অভিব্যক্তিটি এমনভাবে তৈরি হওয়ার পরে আপনি অ-অনুক্রমিক অক্ষরগুলিকে প্রতিস্থাপন করতে পারবেন।
এছাড়াও (সর্বাধিক গুরুত্বপূর্ণ এবং বেদনাদায়ক স্পষ্ট), replace()
কেবল আক্ষরিক মান প্রতিস্থাপন করতে পারে; যেখানে replaceAll
'লাইক' সিকোয়েন্সগুলি প্রতিস্থাপন করতে পারে (অভিন্ন নয়)।
replace()
পদ্ধতিটি রেজেক্স প্যাটার্ন ব্যবহার করে না যেখানে replaceAll()
পদ্ধতিতে রেজেক্স প্যাটার্ন ব্যবহার হয়। সুতরাং replace()
চেয়ে দ্রুত সঞ্চালন replaceAll()
।
চর ডেটা টাইপের কাজগুলি প্রতিস্থাপন করে তবে স্ট্রিং ডেটাটাইপগুলিতে সমস্ত কাজ করে এবং উভয়ই প্রথম যুক্তির সমস্ত উপস্থিতি দ্বিতীয় তর্ক যুক্ত করে প্রতিস্থাপন করে।
str.replaceAll(regex, repl)
হিসাবে একইPattern.compile(regex).matcher(str).replaceAll(repl)
। সুতরাং এটি কতটা ব্যবহৃত হবে তার উপর নির্ভর করে একটি বড় ওভারহেড রয়েছে।