স্ট্রিং থেকে চরের সমস্ত উপস্থিতি সরান


311

আমি এটি ব্যবহার করতে পারি:

String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''

Xজাভার কোনও স্ট্রিং থেকে চরিত্রের সমস্ত উপস্থিতি সরিয়ে দেওয়ার কোনও উপায় আছে ?

আমি এটি চেষ্টা করেছি এবং আমি যা চাই তা তা নয়: str.replace('X',' '); //replace with space


3
আপনি কি একক চরিত্রের স্ট্রিংগুলি প্রতিস্থাপনের চেষ্টা করেছেন?
peter.murray.rust

উত্তর:


523

এর চেয়ে ওভারলোডCharSequence ব্যবহার করার চেষ্টা করুন যা আর্গুমেন্ট নেয় (যেমন, String) char:

str = str.replace("X", "");

2
প্রথম যুক্তি নিয়মিত প্রকাশ, কখনও কখনও এটি প্রত্যাশার মতো কাজ করে না, বিশেষত যদি এই স্ট্রিংটি ব্যবহারকারী ইনপুট থেকে আসে।
vbezhenar

9
@vsb: সত্য নয়। নির্দিষ্ট ওভারলোডের উভয় যুক্তিই হ'ল CharSequencedocs.oracle.com/javase/7/docs/api/java/lang/…
লুক

Xটাইপ চরের ক্ষেত্রে কি করতে হবে ?
কেএনইউ

7
@ কুণাল: আমার ধারণা আপনার toStringপ্রথমে এটি দরকার হবে। সুতরাং আপনার কোডটি দেখতে কিছুটা এমন দেখাবেstr = str.replace(yourChar.toString(), "");
লূকএইচ

দ্রষ্টব্য আপনি ইউনিকোড পলায়নগুলি ব্যবহার করতে পারেন, উদাহরণস্বরূপ ননচার্যাকারগুলি অপসারণ করবেন নাstr = str.replace("\uffff", "");
জাইমে হাবলুটজেল

42

ব্যবহার

public String replaceAll(String regex, String replacement)

কাজ করবে.

ব্যবহার হবে str.replace("X", "");

নির্বাহ

"Xlakjsdf Xxx".replaceAll("X", "");

আয়:

lakjsdf xx

6
আপনি জাভা ১.৪ সমর্থন করার ক্ষেত্রে সীমাবদ্ধ না থাকলে রেগেক্স সম্ভবত এর জন্য ওভারকিল - সংস্করণ 1.5 থেকে একটি replaceওভারলোড রয়েছে যা একটি সহজ লাগে CharSequence
লুক এইচ

3
@ লুকাক, এটি স্ট্রিং.রেপ্লেসের পচা উত্স। এটি রেজেক্স ব্যবহার করছে। আমি সম্মত হই যে এটি রেজেক্স ভারী বোধ করে তবে উপরের স্বীকৃত উত্তরের জন্য এটিই হুডের নীচে। পাবলিক স্ট্রিং প্রতিস্থাপন (CharSequence var1, CharSequence var2) {ফিরে প্যাটার্ন ডটকম ফাইল (var1.toString (), 16) .ম্যাচার (এই) .রেপসএল (ম্যাচার.কোটরেপ্লেসমেন্ট (var2.toString ())); }
পেরি টিউ

24

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

StringUtils.remove("TextX Xto modifyX", 'X');

আমি যা চেয়েছিলাম ঠিক তা সম্ভবত এটির চেয়ে আরও পরিষ্কার দেখাচ্ছে replace
লাইন

6
String test = "09-09-2012";
String arr [] = test.split("-");
String ans = "";

for(String t : arr)
    ans+=t;

স্ট্রিং থেকে - যেখানে আমি চরিত্রটি সরিয়েছি তার উদাহরণ এটি।


4
এটি অত্যন্ত অদক্ষ, বিশেষত গৃহীত উত্তরের সাথে তুলনা করে।
এরিক রবার্টসন

3
আমি মনে করি এই উত্তরটি কার্যকর হয় তবে সঠিক উত্তরটি ছোট এবং
তাত্পর্যপূর্ণ

2

আমি এই উপলক্ষে RegEx ব্যবহার করতে পছন্দ করি:

str = str.replace(/X/g, '');

যেখানে জি মানে গ্লোবাল তাই এটি আপনার পুরো স্ট্রিংয়ের মধ্য দিয়ে যাবে এবং সমস্ত এক্সকে '' দিয়ে প্রতিস্থাপন করবে; আপনি যদি এক্স এবং এক্স উভয়ই প্রতিস্থাপন করতে চান তবে আপনি কেবল বলেছেন:

str = str.replace(/X|x/g, '');

(আমার কোলাহল এখানে দেখুন: মিতাল )


আমি এই শক্তি কাজ অনুমান, কিন্তু সঠিক উত্তর, executes দ্রুত এবং খাটো, এটা সবসময় ভাল যতটা সম্ভব Regex এড়াতে যেমন অন্যান্য পদ্ধতি তুলনায় ধীর হতে পরিচিত হয়
evilReiko

2

হ্যালো নীচে এই কোড ব্যবহার করে দেখুন

public class RemoveCharacter {

    public static void main(String[] args){
        String str = "MXy nameX iXs farXazX";
        char x = 'X';
        System.out.println(removeChr(str,x));
    }

    public static String removeChr(String str, char x){
        StringBuilder strBuilder = new StringBuilder();
        char[] rmString = str.toCharArray();
        for(int i=0; i<rmString.length; i++){
            if(rmString[i] == x){

            } else {
                strBuilder.append(rmString[i]);
            }
        }
        return strBuilder.toString();
    }
}

এক্স এর পরিবর্তে আমাদের কাছে অন্য স্ট্রিং থাকলে আপনি কীভাবে এটি করবেন? চমৎকার সমাধান!
মোনা জালাল

2

প্রতিস্থাপনের পরিবর্তে প্রতিস্থাপনআল ব্যবহার করুন

str = str.replaceAll("X,"");

এটি আপনাকে পছন্দসই উত্তর দেবে।


রিপ্লেসএল ব্যবহার করে শেষ করুন। বাস্তবায়ন দেখুন। এভাবেই স্ট্রিং # return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
রিপ্লেজটি

0
package com.acn.demo.action;

public class RemoveCharFromString {

    static String input = "";
    public static void main(String[] args) {
        input = "abadbbeb34erterb";
        char token = 'b';
        removeChar(token);
    }

    private static void removeChar(char token) {
        // TODO Auto-generated method stub
        System.out.println(input);
        for (int i=0;i<input.length();i++) {
            if (input.charAt(i) == token) {
            input = input.replace(input.charAt(i), ' ');
                System.out.println("MATCH FOUND");
            }
            input = input.replaceAll(" ", "");
            System.out.println(input);
        }
    }
}

input = "deletes all blanks too";দেয় "deletesalllankstoo"
কাপলান

0

এখানে একটি ল্যাম্বডা ফাংশন যা স্ট্রিং হিসাবে পাস সমস্ত অক্ষর মুছে ফেলে

BiFunction<String,String,String> deleteChars = (fromString, chars) -> {
  StringBuilder buf = new StringBuilder( fromString );
  IntStream.range( 0, buf.length() ).forEach( i -> {
    while( i < buf.length() && chars.indexOf( buf.charAt( i ) ) >= 0 )
      buf.deleteCharAt( i );
  } );
  return( buf.toString() );
};

String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"

এই সমাধানটি পরিমাপ করে যে ফলস্বরূপ স্ট্রিং - পার্থক্য থেকে replace()- অক্ষরগুলি সরানোর সময় আরম্ভের স্ট্রিংয়ের চেয়ে বড় হয় না। সুতরাং এটি StringBuilderযেমন চরিত্র-অনুসারে যুক্ত করার সময় বারবার বরাদ্দ এবং অনুলিপি এড়ায় replace()
এর অর্থহীন প্রজন্ম Patternএবং Matcherউদাহরণগুলির উল্লেখ না করে replace()যেগুলি অপসারণের জন্য কখনই প্রয়োজন হয় না। এই সমাধানের
পার্থক্যে replace()এক ঝাঁকুনিতে বেশ কয়েকটি অক্ষর মুছতে পারে।


লাম্বডাস / ফাংশনাল প্রোগ্রামিং এই মুহুর্তে খুব হিপ তবে এটি বেছে নেওয়া উত্তরের চেয়ে 10x দীর্ঘ লম্বা একটি সমাধান তৈরি করতে আইএমএইচও সমর্থনযোগ্য হতে পারে না, তাই ডাউন ভোট।
ভোলসম্যান

str.replace("…", "")ইনস্ট্যান্ট করে private Pattern(…)এবং তারপরে উত্পন্ন প্যাটার্ন কলগুলিতে public String replaceAll(String repl)। সুতরাং নিম্নলিখিত ফাংশন কলগুলি ঘটেছিল: return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString())); - সাল_ভেদার_808 মন্তব্য দেখুন। সবকটি সিএতে আমার হিপ ল্যাম্বদা দ্রবণ থেকে 3 গুণ বেশি লম্বা । এবং এখানে এটি খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে কেন আমার হিপ ল্যাম্বদা দ্রবণটি আরও দ্রুত: জাভার স্ট্রিং :: কেন প্রতিস্থাপন () এত ধীর?
কাপলান

নিজস্ব জিনিস : এটি যদি সমাধানের আকারের বিষয়ে হয় তবে অন্য কয়েকটি সমাধান দ্বিগুণ হিসাবে বা যে সমাধানগুলির জন্য বাইরের পাঠাগারটি প্রয়োজন তা সমালোচনার জন্য আরও উপযুক্ত প্রার্থী হতে পারে। একটি ভাষা বর্ধন যা জাভা 8-র বছর থেকে ভাষার অংশ ছিল সত্যই নিতম্ব নয় । স্কোরিং সিস্টেমের সাথে একটি সাধারণ সমস্যা হ'ল সময়টির কারণটি সমাধানের মানের চেয়ে বেশি ভারী হয়। ফলস্বরূপ, আরও আপ-টু-ডেট এবং মাঝে মাঝে আরও ভাল সমাধান ক্রমবর্ধমান পিছনের তৃতীয়টিতে পাওয়া যাচ্ছে।
কাপলান

কোড প্রয়োগের গতির চেয়ে আমি দীর্ঘ 10x উল্লেখ করছি। প্রতিবার ডাকে একটি রেজেক্স প্যাটার্ন সংকলনকারী যেকোন কিছুও ধীর হতে পারে। আপনাকে উচ্চতর ফ্রিকোয়েন্সিতে এ জাতীয় রেজেক্স ব্যবহার করে সত্যই সংকলিত ম্যাচারের ক্যাশে এবং পুনঃব্যবহার করতে হবে (ওপিতে এটি কোন পরিস্থিতিতে এটি ব্যবহার করা হয়েছে তা বলে না - একটি ফর্ম জমা থেকে ডেটা সাফ করার জন্য বিরল দৃশ্য হতে পারে বা কোনও শক্তভাবে ব্যবহার করা যেতে পারে) লুপকে এক সেকেন্ডে ওয়াল অফ বার বলা হচ্ছে)।
ভলক্সম্যান

পারফরম্যান্স সম্পর্কিত উদ্বেগের বিষয়ে আমি একটি নতুন উত্তর যুক্ত করেছি যা সরবরাহিত বিভিন্ন উত্তরগুলির উপর একটি দ্রুত মানদণ্ড চালায়। যদি ওপি ঘন ঘন এই অপারেশনটি করে থাকে তবে তাদের স্ট্রিং.রেপ্লেস () বিকল্পটি এড়ানো উচিত কারণ হুডের নীচে পুনরায় পুনর্গঠন করা খুব ব্যয়বহুল।
ফোকসম্যান

0

পারফরম্যান্স বেঞ্চমার্ক সহ প্রধান উত্তরগুলির মূল্যায়ন যা উদ্বেগকে নিশ্চিত করে যে বর্তমান নির্বাচিত উত্তরটি হুডের অধীনে ব্যয়বহুল রেজেক্স অপারেশন করে

আজ পর্যন্ত সরবরাহিত উত্তরগুলি 3 টি মূল শৈলীতে আসে (জাভাস্ক্রিপ্ট উত্তর উপেক্ষা করে;)):

  • স্ট্রিং.রেপ্লেস ব্যবহার করুন ("টুডিলিট," "); যা হুডের নিচে রেজেক্স ব্যবহার করে
  • লাম্বদা ব্যবহার করুন
  • সাধারণ জাভা বাস্তবায়ন ব্যবহার করুন

কোড আকারের ক্ষেত্রে স্পষ্টভাবে স্ট্রিং.রেপ্লেস সবচেয়ে ক্ষতিকারক। সহজ জাভা প্রয়োগটি ল্যাম্বদার তুলনায় কিছুটা ছোট এবং ক্লিনার (আইএমএইচও) (আমাকে ভুল করবেন না - আমি ল্যাম্বডাস প্রায়শই যেখানে তারা উপযুক্ত সেগুলি ব্যবহার করি)

এক্সিকিউশন স্পিডটি ছিল দ্রুততম থেকে ধীর করার জন্য: সাধারণ জাভা বাস্তবায়ন, লাম্বদা এবং তারপরে স্ট্রিং.রেপ্লেস () (যেটি রিজেক্সকে আহ্বান করে)।

এতদূর দ্রুততম বাস্তবায়নটি ছিল জাভা বাস্তবায়নটির সাথে সুরযুক্ত যাতে এটি স্ট্রিংবিল্ডার বাফারটিকে সর্বাধিক সম্ভাব্য ফলাফলের দৈর্ঘ্যে প্রিলোকলেট করে এবং তারপরে কেবল "অক্ষর মুছতে অক্ষর" স্ট্রিংগুলিতে নেই এমন বাফারে অক্ষর যুক্ত করে। এটি স্ট্রিংস> 16 টি অক্ষরের দৈর্ঘ্যের (স্ট্রিংবিল্ডারের জন্য ডিফল্ট বরাদ্দ) এর জন্য ঘটে যাওয়া কোনও পুনঃনির্দেশগুলি এড়িয়ে যায় এবং এটি স্ট্রিংয়ের অনুলিপি থেকে অক্ষরগুলি মুছে ফেলার "স্লাইড বাম" পারফরম্যান্সটিকে এড়িয়ে যায় লাম্বদা বাস্তবায়ন।

নীচের কোডটি একটি সাধারণ বেঞ্চমার্ক পরীক্ষা চালায়, প্রতিটি বাস্তবায়নকে 1,000,000 বার চালায় এবং অতিবাহিত সময় লগ করে।

প্রতিটি ফলাফলের সাথে সঠিক ফলাফলগুলি পরিবর্তিত হয় তবে কার্য সম্পাদনের ক্রমটি কখনই পরিবর্তিত হয় না:

Start simple Java implementation
Time: 157 ms
Start Lambda implementation
Time: 253 ms
Start String.replace implementation
Time: 634 ms

ল্যাম্বডা বাস্তবায়ন (ক্যাপলানের উত্তর থেকে অনুলিপি করা) ধীর হতে পারে কারণ এটি অক্ষরটি মুছে ফেলা হতে ডানদিকে সমস্ত অক্ষরের একটি "এক বাম শিফট" সম্পাদন করে। এটি মুছে ফেলার জন্য প্রয়োজনীয় প্রচুর অক্ষরের সাথে দীর্ঘতর স্ট্রিংগুলির জন্য সম্ভবত আরও খারাপ হবে। এছাড়াও ল্যাম্বদা বাস্তবায়নে নিজেই কিছু ওভারহেড থাকতে পারেন।

স্ট্রিং.রেপ্লেস বাস্তবায়ন, রেজেক্স ব্যবহার করে এবং প্রতিটি কলে একটি রেজেক্স "সংকলন" করে। এর একটি অপ্টিমাইজেশন হ'ল প্রত্যক্ষভাবে রেগেক্স ব্যবহার করা এবং প্রতিটি বার সংকলনের ব্যয় এড়াতে সংকলিত প্যাটার্নটি ক্যাশে করা।

package com.sample;

import java.util.function.BiFunction;
import java.util.stream.IntStream;

public class Main {

    static public String deleteCharsSimple(String fromString, String charsToDelete)
    {
        StringBuilder buf = new StringBuilder(fromString.length()); // Preallocate to max possible result length
        for(int i = 0; i < fromString.length(); i++)
            if (charsToDelete.indexOf(fromString.charAt(i)) < 0)
                buf.append(fromString.charAt(i));   // char not in chars to delete so add it
        return buf.toString();
    }

    static public String deleteCharsLambda(String fromString1, String charsToDelete)
    {
        BiFunction<String, String, String> deleteChars = (fromString, chars) -> {
            StringBuilder buf = new StringBuilder(fromString);
            IntStream.range(0, buf.length()).forEach(i -> {
                while (i < buf.length() && chars.indexOf(buf.charAt(i)) >= 0)
                    buf.deleteCharAt(i);
            });
            return (buf.toString());
        };

        return deleteChars.apply(fromString1, charsToDelete);
    }

    static public String deleteCharsReplace(String fromString, String charsToDelete)
    {
        return fromString.replace(charsToDelete, "");
    }


    public static void main(String[] args)
    {
        String str = "XXXTextX XXto modifyX";
        String charsToDelete = "X";  // Should only be one char as per OP's requirement

        long start, end;

        System.out.println("Start simple");
        start = System.currentTimeMillis();

        for (int i = 0; i < 1000000; i++)
            deleteCharsSimple(str, charsToDelete);

        end = System.currentTimeMillis();
        System.out.println("Time: " + (end - start));

        System.out.println("Start lambda");
        start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++)
            deleteCharsLambda(str, charsToDelete);

        end = System.currentTimeMillis();
        System.out.println("Time: " + (end - start));

        System.out.println("Start replace");
        start = System.currentTimeMillis();

        for (int i = 0; i < 1000000; i++)
            deleteCharsReplace(str, charsToDelete);

        end = System.currentTimeMillis();
        System.out.println("Time: " + (end - start));
    }
}

ল্যাম্বডা ফাংশনটি যদি এটি করার উদ্দেশ্যে করা হয় তাই বলা হয়, সময়টি নিম্নলিখিতটি হয় (কেউ ল্যাম্বডা ফাংশনটিকে সদস্য ফাংশনে আবৃত করে না) । তবুও আপনার ডিলিটচার্স রিপ্লেস () ভুল প্রয়োগ করা হয়েছে: এটি একটি স্ট্রিং "এক্সওয়াইজেড" প্রতিস্থাপন করে এবং প্রয়োজনীয় 'এক্স', 'ওয়াই' এবং 'জেড' এর fromString.replace("X", "").replace("Y", "").replace("Z", "");প্রয়োজন অনুসারে নয়। এখন আমরা সঠিক সময় পাই: সহজ সময় শুরু করুন: 759 | ল্যাম্বদা সময় শুরু: 1092 | মুছে ফেলা শুরু করুনচরলম্বদা () সময়: 1420 | সংশোধিত সময় প্রতিস্থাপন শুরু করুন: 4636
কাপলান

"কেউ ল্যাম্বডা ফাংশনটিকে সদস্য ফাংশনে আবৃত করে না" - এটিকে একটি বেঞ্চমার্ক দৃশ্যে কল করার উদ্দেশ্য ব্যতীত যাতে এটি অন্যান্য বাস্তবায়নগুলি যেমন ডাকা হয় তার সাথে সামঞ্জস্য হয়।
ভলক্সম্যান

আমি কেবল বুঝতে পেরেছি যে ওপি একটি একক চরিত্রের সমস্ত উপস্থিতি সরিয়ে দেওয়ার বিষয়ে জিজ্ঞাসা করেছিল কিন্তু আপনার উত্তরটি অক্ষরের একটি সেট নিয়ে কাজ করার সুযোগকে পরিবর্তন করেছে। আমি ব্যবহৃত "গৃহীত" উত্তর বাস্তবায়নটি একাধিক অক্ষরের পরিবেশন করার উদ্দেশ্যে কখনও হয় নি এবং এটি কখনও হয়নি। সুতরাং আমি এটি এবং মানদণ্ডের সময়গুলি প্রতিফলিত করতে উপরের মানদণ্ডটি আপডেট করেছি। বিটিডাব্লু আপনি একাধিক বার প্রতিস্থাপন কল একাধিক অক্ষর সমর্থন করার সুযোগ বাড়ানোর জন্য ব্যয়বহুল। সমস্ত ("[এক্সওয়াইজেড]", "") প্রতিস্থাপনের জন্য একটি একক কল এ স্যুইচ করা ভাল
ভলকসম্যান

সমাধান হিসাবে দেখানো ফাংশন কল করা হয় শুধুমাত্র একবার উদ্দিষ্ট করা হয়। ফাংশন সংজ্ঞাটি অতিরিক্তভাবে ফাংশন কলটিকে সদস্য ফাংশনে আবদ্ধ করার জন্য বেঞ্চমার্কটি বিকৃত করার একমাত্র প্রভাব রয়েছে।
কাপলান

প্রতিটি কলের বৈকল্পিকতা এত বেশি হওয়ায় একক কল করে দ্রুত সময়ের জন্য পদ্ধতিগুলি সঠিকভাবে বেঞ্চমার্ক করা কার্যত অসম্ভব। সুতরাং বেঞ্চমার্কিংয়ে একই পদ্ধতিতে সাধারণত বহুবার পুনরাবৃত্তি করা হয় এবং তারপরে বিকল্পগুলির মোট সময়ের সাথে (বা প্রয়োজনে গড় গণনা করার জন্য) তুলনা করার জন্য মোট সময়টি মূল্যায়ন করা হয় ..
ভলকসম্যান

0

প্রতিস্থাপনের সময় আপনাকে বর্গাকার বন্ধনীগুলির মধ্যে অক্ষরগুলি সরিয়ে ফেলতে হবে। উদাহরণ কোডটি নিম্নলিখিত হিসাবে থাকবে:

String s = "$116.42".replaceAll("[$]", "");

-3

আপনি str = str.replace("X", "");পূর্বে উল্লিখিত হিসাবে ব্যবহার করতে পারেন এবং আপনি ভাল থাকবেন। আপনার তথ্যের ''জন্য একটি খালি (বা একটি বৈধ) অক্ষর নয় '\0'তবে।

সুতরাং আপনি str = str.replace('X', '\0');পরিবর্তে ব্যবহার করতে পারে ।


9
এটি ভুল। '\ 0' একটি আসল নাল অক্ষর তৈরি করবে। স্ট্রিংরেপ্লেস ('এক্স', '\ 0') স্ট্রিংরেপ্লেসের ("এক্স", "\ u0000") সমতুল্য যা ওপি যা চেয়েছিল তা মোটেই নয়
অ্যান্ড্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.