স্ট্রিং রিপ্লেজ () এবং রিপ্লেসএল () এর মধ্যে পার্থক্য


221

জাভা.এল.আর. স্ট্রিংয়ের পদ্ধতি replace()এবং replaceAll()পদ্ধতিগুলির মধ্যে পার্থক্য কী , পরে রেজেক্স ব্যবহার করে? সহজ পরিবর্তকগুলি প্রতিস্থাপন মত .দিয়ে / , কোনো পার্থক্য কি?

উত্তর:


174

ইন java.lang.String, replaceপদ্ধতি পারেন গৃহস্থালির কাজ এর একজোড়া বা একজোড়া লাগে CharSequence(যার মধ্যে স্ট্রিং একটি উপশ্রেণী তাই এটি আনন্দের সাথে STRING এর একজোড়া নেব) 'র। replaceপদ্ধতি একটি গৃহস্থালি বা এর সমস্ত সংঘটন প্রতিস্থাপন করবে CharSequence। অন্যদিকে, উভয় Stringআর্গুমেন্ট replaceFirstএবং replaceAllরেগুলার এক্সপ্রেশনের (Regex) হয়। ভুল ফাংশন ব্যবহার করে সূক্ষ্ম বাগগুলি হতে পারে।


30
উপরন্তু, জাভা ডক্স অনুযায়ী, এর প্রতিটি কলের str.replaceAll(regex, repl)হিসাবে একই Pattern.compile(regex).matcher(str).replaceAll(repl)। সুতরাং এটি কতটা ব্যবহৃত হবে তার উপর নির্ভর করে একটি বড় ওভারহেড রয়েছে।
ব্যবহারকারী 845279

4
@ ইউজার 845279 আপনি আকর্ষণীয় হবেন যে আপনি যেহেতু String#replace(target, replacement)একই জিনিসটি ব্যবহার করেন, এটি স্ট্রিংয়ের উদ্ধৃতি ব্যতীত: এর চেয়ে দ্রুততর হওয়ার Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));কোনও কারণ আছে কি ? কেবল অতিরিক্ত ক্রিয়াকলাপ সম্পাদন করার পরে এটি এটিকে মনে হবে না । String#replaceString#replaceAllString#replace
Horsey

1
শুধু কৌতূহল, এই উত্তরে যেখানে স্পষ্ট তুলনা করা হয় replaceAll। উত্তরটি সম্পর্কে আরওreplace
ম্যানুয়েল জর্ডান

এর অর্থ রেগেক্স ম্যাচের কারণে প্রতিস্থাপনকৃত সমস্ত () ব্যয়বহুল হবে? তাই না?
অবাক

97

প্রশ্ন:java.lang.String পদ্ধতিগুলির মধ্যে পার্থক্য কী replace()এবং replaceAll()পরবর্তী সময়ে রেজেক্স ব্যবহার করে।

উত্তর: কেবলমাত্র রেজেক্স তারা উভয়ই প্রতিস্থাপন :)

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

পুনশ্চ:

এছাড়াও একটি আছে replaceFirst()(যা একটি রেজেক্স লাগে)


1
স্পষ্টতার জন্য Thx যে এটি কেবলমাত্র রেগেক্স। আমি কীভাবে চাই যে তারা এটির নামকরণ করেছে উইথরেজেক্স () এর বদলে প্রতিস্থাপনের সব ())
হোপকিং

স্পষ্টকরণ : রিপ্লেসএল () নিয়মিত প্রকাশের সাথে কাজ করে, প্রতিস্থাপন () চারসেকেন্সের সাথে কাজ করে
জনি পাঁচ

2
পছন্দ করেছেন নিয়মিত এক্সপ্রেশন কোনও প্রকার নয়, CharSequenceহয়। উভয় replace()এবং replaceAll()"সাথে কাজ CharSequence"। এটি দেওয়াটিকে একটি নিয়মিত প্রকাশ হিসাবে replaceAll()বিবেচনা করে CharSequenceতাই এটি রেগেক্স ম্যাচগুলির সন্ধান করে , প্রদত্তটিকে একটি সরল অনুসন্ধান পাঠ হিসাবে replace()বিবেচনা করে CharSequenceযাতে এটি এর উপস্থিতিগুলির জন্য অনুসন্ধান করে।
সান্টিবাইলর্স

43

উভয় 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

আরো দেখুন

নথিপত্র

নিয়মিত অভিব্যক্তি


34

replace()পদ্ধতি উভয় একটি আদিম গ্রহণ করতে ওভারলোড হয় charএবং একটি CharSequenceআর্গুমেন্ট হিসাবে।

এখন যতটা পারফরম্যান্স সম্পর্কিত, তত্ক্ষণিক পদ্ধতিটি আরও replace()দ্রুততর replaceAll()কারণ দ্বিতীয়টি প্রথমে রেজেক্স প্যাটার্নটি সংকলন করে এবং শেষ পর্যন্ত প্রতিস্থাপনের আগে মেলে যেখানে প্রাক্তন কেবল সরবরাহিত যুক্তির সাথে মেলে এবং প্রতিস্থাপন করে।

যেহেতু আমরা জানি রেজেক্স প্যাটার্নের মিলটি কিছুটা জটিল এবং ফলস্বরূপ ধীর হয়, তখনই যখন সম্ভব সম্ভব হয় তার চেয়ে replace()বেশি পছন্দ করা replaceAll()উচিত।

উদাহরণস্বরূপ, আপনার উল্লেখ করা সহজ বিকল্পগুলির জন্য, ব্যবহার করা ভাল is

replace('.', '\\');

পরিবর্তে:

replaceAll("\\.", "\\\\");

দ্রষ্টব্য: উপরের রূপান্তর পদ্ধতির যুক্তিগুলি সিস্টেম-নির্ভর।


6
এমনকি প্রতিস্থাপনটিও একই কাজ করুন, জাভা স্ট্রিং ডক্স থেকে :: পাবলিক স্ট্রিং প্রতিস্থাপন (চারসেকেন্স লক্ষ্য, চার সিকোয়েন্স প্রতিস্থাপন) - প্যাটার্ন ডটকমপিলেট (টার্গেট.টোস্ট্রিং (), প্যাটার্ন.লাইটারাল) .ম্যাচার (এটি) .রেজলএল (ম্যাচার.কোটরেপ্লেসমেন্ট) (replacement.toString ())); }
প্রেত্তেক

@ প্রীতেক: জেডিকি 8 এর পরে, স্ট্রিং :: প্রতিস্থাপনটি আর প্যাটার্ন ব্যবহার করছে না: hg.openjdk.java.net/jdk9/jdk9/jdk/file/65464a307408/src/… , jdk11 তে একই।
ফ্রাঙ্ক

সম্মত হন, জাভা 8-এ কার্যত দুটি পদ্ধতিই প্রায় একই, উভয়ই Pattern.compile(...)তাদের বাস্তবায়নের বিষয়বস্তু / অংশের উপস্থিতির replaceজন্য প্রথম যুক্তিটি কীভাবে সংজ্ঞায়িত / প্রেরণ করবেন সে সম্পর্কে কম জটিল বলে মনে হয়। এটি প্রয়োজন হয় না "\"। উপরন্তু replaceজাভা যেহেতু পাওয়া যায় 1.5এবং replaceAllযেহেতু1.4
ম্যানুয়েল জর্ডান

3
String replace(char oldChar, char newChar)

এই স্ট্রিংয়ে পুরানোচরের সমস্ত উপস্থিতিগুলিকে নতুনচর দিয়ে প্রতিস্থাপনের ফলে নতুন স্ট্রিং প্রদান করে।

String replaceAll(String regex, String replacement

এই স্ট্রিংয়ের প্রতিটি স্ট্রিং প্রতিস্থাপন করে যা প্রদত্ত প্রতিস্থাপনের সাথে প্রদত্ত নিয়মিত প্রকাশের সাথে মেলে।


3
  1. উভয়ই প্রতিস্থাপন () এবং রিপ্লেসএল () দুটি আর্গুমেন্ট গ্রহণ করে এবং দ্বিতীয় স্ট্রিংয়ের সাথে দ্বিতীয় স্ট্রিংয়ের (দ্বিতীয় যুক্তি) প্রথম স্ট্রিংয়ের (প্রথম যুক্তি) সমস্ত উপস্থিতি প্রতিস্থাপন করে।
  2. প্রতিস্থাপন () চর বা অক্ষরক্ষেত্রের একজোড়া গ্রহণ করে এবং প্রতিস্থাপনকৃত সমস্ত () এক জোড়া রিজেক্স গ্রহণ করে।
  3. এটি সত্য নয় যে প্রতিস্থাপন () রিপ্লেসমএল () এর চেয়ে দ্রুত কাজ করে যেহেতু উভয়ই এর প্রয়োগের ক্ষেত্রে একই কোড ব্যবহার করে

    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?"

4
তারা ঠিক একই বাস্তবায়ন হয় না। replaceকল না Pattern.compile(regex).matcher(this).replaceAll(replacement);। এটি কল করেPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
চিফ টুপেনসিলস

রিপ্লেসএল () রিজেক্সের একটি জুটি গ্রহণ করে কেন অনুসন্ধান স্ট্রিং এবং প্রতিস্থাপনের স্ট্রিং উভয়ই একটি রেজেক্স হবে? ঘটনাগুলির সাথে কী প্রতিস্থাপন করা হবে? একটি রেজেক্সের সাথে? অবশ্যই কেবল প্রথম যুক্তিটি হ'ল একটি রেজেক্স (অনুসন্ধানের স্ট্রিং)। দ্বিতীয়টি কোনও রেজেক্স নয় (প্রতিস্থাপনের স্ট্রিং)।
সান্টিবাইলার্স

1

উইকডির উত্তরে ইঙ্গিত করা হয়েছে, প্রতিস্থাপনের সাথে প্রতিস্থাপনের স্ট্রিং প্রতিস্থাপন এবং রিপ্লেসমএল এর মধ্যে আলাদাভাবে পরিচালনা করা হয়। আমি একটি [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 প্রিন্ট করে

এটি বেশ উপদ্রব হতে পারে, যেমন জাভা.এসকিএল.ডাটাবেসমেটাডাটা.জেটসন্ধান স্ট্রিংইস্প্যাক্ট () রিপ্লেসএল () সহ ফিরিয়ে দেওয়া মানটি ব্যবহার করার চেষ্টা করার সময়।


0

পুরানো থ্রেডটি আমি জানি তবে আমি জাভাতে একরকম নতুন এবং এর মধ্যে একটি অদ্ভুত জিনিস আবিষ্কার করি। আমি ব্যবহার করেছি 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 );

1
String.replaceAll()আক্ষরিক যুক্তি হিসাবে নিয়মিত প্রকাশগুলি প্রত্যাশা করে , এজন্যই আপনি "অনাকাঙ্ক্ষিত" (যা সত্যিই খুব বেশি অনুমানযোগ্য) ফলাফল পান। String.replace()আপনি চান ভাবে কাজ করে।
নাদের

থাম্বের নিয়ম হিসাবে যখন আমরা জাভা থেকে অপ্রত্যাশিত ফলাফলগুলি পাই, তার পরিবর্তে কোনও নতুন ফাংশন ডিজাইনের পরিবর্তে, ধরে নেওয়া ভাল যে এই ফলাফলগুলি ঠিকই মরে গেছে এবং আমরা যে জাভা কার্যকারিতাটি ব্যবহার করছি তা ভুল বুঝছি।
সান্টিবাইলার্স

0

ইতিমধ্যে নির্বাচিত "সেরা উত্তর" (এবং সুরাগের মতো আরও ভাল) এর সাথে যুক্ত করার জন্য, ক্রমযুক্ত String.replace()অক্ষরগুলি প্রতিস্থাপনের দ্বারা আবদ্ধ করা হয়েছে (এভাবে নেওয়া হচ্ছে CharSequence)। তবে String.replaceAll()কেবলমাত্র ক্রমিক অক্ষরগুলি প্রতিস্থাপন করে বাধা হয় না। আপনার নিয়মিত অভিব্যক্তিটি এমনভাবে তৈরি হওয়ার পরে আপনি অ-অনুক্রমিক অক্ষরগুলিকে প্রতিস্থাপন করতে পারবেন।

এছাড়াও (সর্বাধিক গুরুত্বপূর্ণ এবং বেদনাদায়ক স্পষ্ট), replace()কেবল আক্ষরিক মান প্রতিস্থাপন করতে পারে; যেখানে replaceAll'লাইক' সিকোয়েন্সগুলি প্রতিস্থাপন করতে পারে (অভিন্ন নয়)।


-1

replace()পদ্ধতিটি রেজেক্স প্যাটার্ন ব্যবহার করে না যেখানে replaceAll()পদ্ধতিতে রেজেক্স প্যাটার্ন ব্যবহার হয়। সুতরাং replace()চেয়ে দ্রুত সঞ্চালন replaceAll()


3
এটা সত্যি না. আপনি যদি প্রতিস্থাপনের উত্সটি দেখেন তবে এটি দেখতে পাবেন এটি প্যাটার্ন এবং ম্যাচার (অর্থাত্ regex)
xtrakBandit

-5

চর ডেটা টাইপের কাজগুলি প্রতিস্থাপন করে তবে স্ট্রিং ডেটাটাইপগুলিতে সমস্ত কাজ করে এবং উভয়ই প্রথম যুক্তির সমস্ত উপস্থিতি দ্বিতীয় তর্ক যুক্ত করে প্রতিস্থাপন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.