জাভা স্ট্রিং.ট্রিম () কতটি স্থান সরিয়ে ফেলবে?


117

জাভাতে, আমার কাছে একটি স্ট্রিং রয়েছে:

"     content     ".

হবে String.trim()প্রতিটি এই পক্ষের সব স্পেস বা শুধু একটা স্থান সরাবেন?


197
অবতীর্ণদের কাছে: আপনার আচরণটি সম্মোহক। এই প্রশ্নটি বিশদ এবং সুনির্দিষ্ট, স্পষ্টভাবে এবং সহজভাবে লিখিত হয়েছে, অন্য কোথাও কমপক্ষে অন্য একজন প্রোগ্রামারের আগ্রহের জন্য। জাভাডোক বা সোর্স কোডটি কোথায় সন্ধান করতে হবে তা লোকেরা জানেন না। আমাদের কাজ হ'ল তাদেরকে সহায়তা করা, অজ্ঞ হওয়ার কারণে তাদের ঘৃণা করা নয়।
glmxndr

14
@ সুবন্তান্তে, আপনি সঠিক বলেছেন। গুগল'শ প্রশ্ন জিজ্ঞাসা করার জন্য আমি আগেও লোকদের রক্ষা করেছি। যাইহোক, এর থেকে সহজ কিছু পরীক্ষা করা উচিত নিজের নিজের, এবং আইএমওর, কোনও প্রশ্নোত্তরের সাইটে কোনও প্রশ্ন পোস্ট করার পরোয়ানা দেওয়া উচিত নয়। শিরোনাম বিভ্রান্তিকর এবং প্রশ্নটি যারা পড়েন তাদের পক্ষে সময় নষ্ট করা।
ক্রিস

9
@ ক্রিস: আনাত আমাকে উত্স কোডটি দেখার জন্য উপলক্ষ দিয়েছে। আমি ট্রিম () সম্পর্কে অনেক কিছু শিখেছি। আমি অন্যথায় না। প্রত্যেকে নিজের সময় ব্যয় করার জন্য দায়বদ্ধ। আমাদের তার আপাত দৃষ্টিনন্দন প্রশ্ন থেকে লাভ পেতে না পারার জন্য ওয়ানতকে দোষ দেওয়া হবে না।
glmxndr

1
@ স্কাফম্যান: (গ) "চেষ্টা করে দেখুন" হওয়া উচিত, এবং কেবলমাত্র (ডি) এসও-তে জিজ্ঞাসা করুন।
ম্যাক

2
এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি এমন কোনও একটি বিষয় যা কোনও ব্যক্তিকে এক মিনিটের মধ্যে ম্যানুয়াল এবং পরীক্ষায় সন্ধান করতে সক্ষম হওয়া উচিত about
জেস্পার

উত্তর:


168

তাদের সব

রিটার্নস : শীর্ষস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্থানটি সহ এই স্ট্রিংয়ের একটি অনুলিপি, বা এই স্ট্রিংটির যদি কোনও শীর্ষস্থানীয় বা অনুসরণকারী শ্বেত স্থান না থাকে।

Java জাভা 1.5.0 ডক্স থেকে উদ্ধৃত

(তবে কেন আপনি কেবল এটি চেষ্টা করে দেখলেন না এবং নিজের জন্য দেখুন?)


1
আমাকে উত্তর-ভোট দিতে হয়েছিল কারণ এই উত্তরটিতে "হোয়াইট স্পেস" দ্বারা ডকুমেন্টেশনটির অর্থ কী তা অন্তর্ভুক্ত হয় না। এটি যুক্তিসঙ্গত বলে মনে হবে যেখানে Chararacter.isWhitespaceএটি সত্য হবে তবে এটি "হোয়াইটস্পেস" বলতে বোঝায় না ...
ব্যবহারকারীর 2864740

7
@ user2864740: এই উত্তরটি ব্যাপক বিশ্লেষণ হতে উদ্দেশ্যে না হয় trim, isWhiteSpaceইত্যাদি বা জাভা ডক্সে অস্পষ্টতা আলোচনার; এটি উপরে জিজ্ঞাসা করা নির্দিষ্ট প্রশ্নের সরাসরি উত্তর - অর্থাত্, trimপদ্ধতিটি কোনও একক স্থান বা একাধিক স্থান সরিয়ে দেয়?
লুক

আমি জানি এটা হয় না। আমি ডাউন-ভোট দিয়েছি কারণ এটি পাসেও এমনটি উল্লেখ করতে ব্যর্থ। যাই হোক না কেন, আমি আমার ভোটটি পূর্বাবস্থায়িত করতে পারি না যদি না আপডেট হয় (তবে স্বল্প পরিমাণে)।
ব্যবহারকারী 2864740

33

উত্স কোড থেকে (পচে যাওয়া):

  public String trim()
  {
    int i = this.count;
    int j = 0;
    int k = this.offset;
    char[] arrayOfChar = this.value;
    while ((j < i) && (arrayOfChar[(k + j)] <= ' '))
      ++j;
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' '))
      --i;
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this);
  }

যে দুটি whileঅক্ষর আপনি দেখতে পাচ্ছেন তার অর্থ এমন সমস্ত অক্ষর যার ইউনিকোড স্পেস অক্ষরের নীচে এবং শুরুতে এবং শেষে রয়েছে, সরানো হয়েছে।


27

সন্দেহ হলে, একটি ইউনিট পরীক্ষা লিখুন:

@Test
public void trimRemoveAllBlanks(){
    assertThat("    content   ".trim(), is("content"));
}

এনবি : অবশ্যই পরীক্ষা (জুনিত + হ্যামক্রাস্টের জন্য) ব্যর্থ হয় না


43
এমন একটি নতুন প্রোগ্রামারকে জিজ্ঞাসা করুন যা স্রেফ একটি সিস্টেম.আউট.প্রিন্টলন কীভাবে কী করতে হবে তা কী ফলাফল তা দেখার জন্য ইউনিট পরীক্ষা করতে
শিখেছে

26

একটি বিষয় উল্লেখ করার মতো, তবে স্ট্রিং.ট্রিমের "হোয়াইটস্পেস" এর একটি অদ্ভুত সংজ্ঞা রয়েছে। এটি ইউনিকোড হোয়াইটস্পেস অপসারণ করে না, তবে ASCII নিয়ন্ত্রণ অক্ষরও সরিয়ে দেয় যা আপনি হোয়াইটস্পেস বিবেচনা করতে পারেন না।

এই পদ্ধতিটি স্ট্রিংয়ের শুরু এবং শেষ থেকে হোয়াইটস্পেস ছাঁটাই করতে ব্যবহার করা যেতে পারে; বাস্তবে, এটি সমস্ত ASCII নিয়ন্ত্রণ অক্ষরগুলিকেও ছাঁটাই করে।

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


3
ডিজাইনার অংশগুলিতে একটি ভয়াবহ তদারকির মতো মনে হচ্ছে .. এবং ডকুমেন্টেশনের ভয়ঙ্করভাবে ওভার-টেকনিক্যাল কাজ খুব একটা সহায়তা করে না।
ব্যবহারকারী 2864740

2
বলিহারি! আপনি স্ট্যাকওভারফ্লোতে কখনও জিজ্ঞাসা করা সহজ প্রশ্নটি নিয়েছিলেন এবং এ সম্পর্কে বলার জন্য বুদ্ধিমান কিছু পেয়েছেন। আপনি দৌড়ের জন্য ক্রেডিট।
মার্ক ম্যাকেন্না

3
@ মার্ক ম্যাককেইনা: আমি খুঁজেছি যে এই অতি-সাধারণ প্রোগ্রামিং প্রশ্নগুলি (ট্রিমিং স্ট্রিংগুলি, ফাইলের নাম এক্সটেনশনগুলি সন্ধান করা) সবসময় তাদের গোপন জটিলতা থাকে। এটি আমাদের কারুশিল্প এবং সরঞ্জামগুলি সম্পর্কে কিছুটা হতাশাব্যঞ্জক।
থিলো

15

স্ট্রিং ক্লাসের জন্য এপিআই দেখুন :

নেতৃস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্পেস বাদ দিয়ে স্ট্রিংয়ের একটি অনুলিপি দেয়।

উভয় পক্ষের সাদা স্থান সরানো হয়েছে:

নোট যে trim()স্ট্রিং উদাহরণ পরিবর্তন করে না, এটি একটি নতুন অবজেক্ট ফিরিয়ে দেবে:

 String original = "  content  ";
 String withoutWhitespace = original.trim();

 // original still refers to "  content  "
 // and withoutWhitespace refers to "content"

1
আসলে স্ট্রিং উদাহরণটি কিছুই পরিবর্তন করতে পারে না (ভিএম ক্র্যাশ করতে পারে এমন কিছু নোংরা জিনিস বাদে)
অ্যাভ্রড্রাগন

13

এখানে জাভা ডক্সের ভিত্তিতে , .trim()'\ u0020' প্রতিস্থাপন করে যা সাধারণত সাদা স্থান হিসাবে পরিচিত as

তবে খেয়াল করুন, '\ u00A0' ( ইউনিকোড নো- BREAK স্পেস&nbsp; ) একটি সাদা স্থান হিসাবে দেখা গেছে, এবং .trim()এটি মুছে ফেলবে না। এটি এইচটিএমএলে বিশেষত সাধারণ।

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

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");

এই সমস্যার উদাহরণ এখানে আলোচনা করা হয়েছিল ।


জাভাডকের উপর ভিত্তি করে এটি শীর্ষস্থানীয় এবং অনুসরণকারী শ্বেতস্পেসকে সরিয়ে দেয় , যার মধ্যে স্থান, ট্যাব, নিউলাইন ক্যারেজ রিটার্ন, ফর্ম ফিড, ... এবং এতে নেতৃত্বদানকারী বা অনুসরণযোগ্য নয় এমন অক্ষরগুলি অন্তর্ভুক্ত রয়েছে।
লার্নের মার্কুইস

ধন্যবাদ, এটি আমাকে বরাদ্দ করতে সহায়তা করে
আসাদ হায়দার

8

trim()জায়গাগুলি অপসারণের উদাহরণ :

public class Test
{
    public static void main(String[] args)
    {
        String str = "\n\t This is be trimmed.\n\n";

        String newStr = str.trim();     //removes newlines, tabs and spaces.

        System.out.println("old = " + str);
        System.out.println("new = " + newStr);
    }
}

আউটপুট

old = 
 This is a String.


new = This is a String.

4

জাভা ডক্স (স্ট্রিং ক্লাস উত্স) থেকে,

/**
 * Returns a copy of the string, with leading and trailing whitespace
 * omitted.
 * <p>
 * If this <code>String</code> object represents an empty character
 * sequence, or the first and last characters of character sequence
 * represented by this <code>String</code> object both have codes
 * greater than <code>'&#92;u0020'</code> (the space character), then a
 * reference to this <code>String</code> object is returned.
 * <p>
 * Otherwise, if there is no character with a code greater than
 * <code>'&#92;u0020'</code> in the string, then a new
 * <code>String</code> object representing an empty string is created
 * and returned.
 * <p>
 * Otherwise, let <i>k</i> be the index of the first character in the
 * string whose code is greater than <code>'&#92;u0020'</code>, and let
 * <i>m</i> be the index of the last character in the string whose code
 * is greater than <code>'&#92;u0020'</code>. A new <code>String</code>
 * object is created, representing the substring of this string that
 * begins with the character at index <i>k</i> and ends with the
 * character at index <i>m</i>-that is, the result of
 * <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>.
 * <p>
 * This method may be used to trim whitespace (as defined above) from
 * the beginning and end of a string.
 *
 * @return  A copy of this string with leading and trailing white
 *          space removed, or this string if it has no leading or
 *          trailing white space.
 */
public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

নোট করুন যে শুরু এবং দৈর্ঘ্য পাওয়ার পরে এটি স্ট্রিং ক্লাসের সাবস্ট্রিং পদ্ধতিটিকে কল করে।


যেখানে "হোয়াইটস্পেস" "characters x20 এর চেয়ে কম বা সমান মানের সাথে অক্ষর" .. ব্রিল্যান্ট।
ব্যবহারকারী 2864740

3

trim()সমস্ত নেতৃস্থানীয় এবং অনুসরণকারী ফাঁকাগুলি সরিয়ে ফেলবে। তবে সচেতন থাকুন: আপনার স্ট্রিং পরিবর্তন হয়নি। trim()পরিবর্তে একটি নতুন স্ট্রিং উদাহরণ ফিরে আসবে।


এটি সমস্ত নেতৃস্থানীয় এবং অনুসরণকারী সাদা স্থান
লার্নের মারকুইস

3

যদি আপনার স্ট্রিং ইনপুট হয়:

String a = "   abc   ";
System.out.println(a);

হ্যাঁ, আউটপুট হবে "abc"; তবে যদি আপনার স্ট্রিং ইনপুটটি হয়:

String b = "    This  is  a  test  "
System.out.println(b);

আউটপুট This is a test তাই ট্রিম আপনার প্রথম চরিত্রের আগে এবং স্ট্রিংয়ের মধ্যে আপনার শেষ অক্ষরের পরে কেবল স্থানগুলি সরিয়ে দেয় এবং অভ্যন্তরীণ স্পেসগুলি উপেক্ষা করে। এটি আমার কোডের একটি অংশ Stringযা অভ্যন্তরীণ স্পেসগুলি সরিয়ে ট্রিম পদ্ধতিতে বিল্টটি সামান্য অনুকূল করে এবং স্ট্রিংয়ে আপনার প্রথম এবং শেষ অক্ষরের আগে এবং পরে ফাঁকা স্থানগুলি সরিয়ে দেয়। আশা করি এটা সাহায্য করবে.

public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }

এই উত্তরের প্রথম দুটি বিবৃতি স্পষ্টত ভুল, আউটপুট "abc" হবে না । সম্ভবত আপনি ভুলে গেছি .trim()মধ্যে System.out.println(a);?
আরজান

2

এটি উভয় পক্ষের সমস্ত স্থান সরিয়ে ফেলবে।


2

একটি খুব গুরুত্বপূর্ণ বিষয় হ'ল সম্পূর্ণরূপে "সাদা স্পেস" দিয়ে তৈরি একটি স্ট্রিং একটি খালি স্ট্রিং ফিরে আসবে।

যদি একটি string sSomething = "xxxxx", যেখানে xসাদা স্পেসগুলির জন্য দাঁড়িয়ে থাকে, sSomething.trim()খালি স্ট্রিংটি ফিরিয়ে দেবে।

যদি একটি string sSomething = "xxAxx", যেখানে xসাদা স্পেসের জন্য দাঁড়িয়ে থাকে, sSomething.trim()ফিরে আসবে A

যদি sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()ফিরে আসবে SomethingxxxxAndSomethingxElse, লক্ষ্য করুন যে xশব্দের মধ্যে সংখ্যাটি পরিবর্তিত হয়নি।

আপনি যদি চান তবে একটি ঝরঝরে প্যাকড স্ট্রিংটি trim()এই পোস্টে প্রদর্শিত রেগেক্সের সাথে একত্রিত : জাভা ব্যবহার করে স্ট্রিংয়ের নকল সাদা স্থানগুলি কীভাবে সরিয়ে নেওয়া যায়?

অর্ডার ফলাফলের জন্য অর্থহীন তবে trim()প্রথমটি আরও কার্যকর হবে। আশা করি এটা সাহায্য করবে.


2

স্ট্রিংয়ের জন্য কেবল একটি উদাহরণ রাখতে, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন।

str = "  Hello   ";

অথবা

str = str.trim();

তারপরে strস্ট্রিংয়ের মান হবেstr = "Hello"


0

ট্রিম () উভয় পক্ষের জন্য কাজ করে।



0

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

"     content     ".trim();

আপনি টিপানোর "content"পরে ফলাফল হিসাবে দেখতে পাবেন Enter(বা Ctrl+Rগ্রোভি কনসোলে)।


6
সুতরাং জাভাতে কোনও পদ্ধতি বুঝতে তার উচিত একটি সম্পূর্ণ নতুন ভাষা শেখা। সত্যি?
james.garriss

0
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");

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

2
@ মারক কিন্তু দুর্ঘটনাক্রমে আমি যখন এই প্রশ্নটি
খুলছিলাম

এটিও অর্থহীন। এটি করার জন্য যদি কিছু বাকী থাকে তবে trim()ইতিমধ্যে যা করতে repkaceAll()হবে তা করে ।
লার্নের মার্কুইস

@ এজেপি রিপ্লেসএল স্ট্রিংয়ের সাদা জায়গাগুলিও একক স্থানের সাথে প্রতিস্থাপন করবে, যখন ট্রিমটি কেবল শীর্ষস্থানীয় এবং পিছনের স্থানগুলি পরিচালনা করবে
কৃষ্ণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.