একক অক্ষর এবং ট্রিম স্ট্রিংয়ে সাদা স্থানের ক্রমগুলি সঙ্কুচিত করুন


122

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

"    Hello      this  is a   long       string!   "

আমি এটিকে রূপান্তর করতে চাই:

"Hello this is a long string!"

উত্তর:


125

OS X 10.7+ এবং iOS 3.2+

নেটিভ ব্যবহার করুন regexp সমাধান hfossli দ্বারা উপলব্ধ।

অন্যভাবে

হয় আপনার পছন্দসই regexp লাইব্রেরি ব্যবহার করুন বা নিম্নলিখিত কোকো-নেটিভ সমাধান ব্যবহার করুন:

NSString *theString = @"    Hello      this  is a   long       string!   ";

NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];

NSArray *parts = [theString componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
theString = [filteredArray componentsJoinedByString:@" "];

4
আমি এর পারফরম্যান্সের তুলনাটি কৌতুক করব একটি প্রান্তটি অপসারণের জন্য একটি ট্রিম দিয়ে একটি রেজেক্স প্রতিস্থাপনের সাথে। একদিকে, আপনার সাথে ডিল করার জন্য একটি রেইজেক্স রয়েছে। অন্যদিকে, আপনার একটি শিকারী রয়েছে। হয় স্বতঃপ্রকাশের অভ্যন্তরীণ প্রক্রিয়াকরণ প্রয়োজন।
লিলবির্ডি

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

2
উত্তম উত্তর, যেমন উত্সাহিত, কিন্তু আমি আপনার "সহজ" এর সংজ্ঞাটিকে চ্যালেঞ্জ জানাই। আন্তরিকভাবে, প্রাক্তন পাইথন ছেলেটি এখন ওবজেসি-ল্যান্ডে ;-)
জে কে

2
আপনি 'সহজ সমাধান যদি জটিল সমাধান ব্যবহার করবেন না' বলে আমাকে হাসিয়ে দিয়েছিলেন। তাহলে সবচেয়ে সহজতমটি হল [টু ট্রিম্মড স্ট্রিংবিয়েরপ্লেসিংঅ্যাক্সিয়েন্সস অফ স্ট্রিং: @ "" উইথ স্ট্রিং: @ ""] না? আমি এখনও আপনার উত্তর upvote কিন্তু এটি অবশ্যই সহজতম
মারিও কারভালহো

2
@ মারিও কারভালহো প্রশ্নটি জিজ্ঞাসা করে যে কীভাবে অতিরিক্ত সাদা অংশকে সরিয়ে ফেলা যায়, সবগুলিই নয়।
সুইলিয়ামস

52

রেজেক্স এবং এনএসচার্যাক্টসেট আপনাকে সহায়তা করার জন্য এখানে রয়েছে। এই সমাধানটি শ্বেত স্পেসের পাশাপাশি একাধিক শ্বেত স্পেস ছাঁটাই করে।

NSString *original = @"    Hello      this  is a   long       string!   ";

NSString *squashed = [original stringByReplacingOccurrencesOfString:@"[ ]+"
                                                         withString:@" "
                                                            options:NSRegularExpressionSearch
                                                              range:NSMakeRange(0, original.length)];

NSString *final = [squashed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

লগিং finalদেয়

"Hello this is a long string!"

সম্ভাব্য বিকল্প রেজেক্স প্যাটার্ন:

  • কেবল স্থান প্রতিস্থাপন করুন: [ ]+
  • স্থান এবং ট্যাবগুলি প্রতিস্থাপন করুন: [ \\t]+
  • স্থান, ট্যাব এবং নিউলাইনগুলি প্রতিস্থাপন করুন: \\s+

পারফরম্যান্স রুনডাউন

এক্সটেনশনের সহজতা, পারফরম্যান্স, কোডের সংখ্যা লাইন এবং তৈরি করা সামগ্রীর সংখ্যা এই সমাধানটিকে উপযুক্ত করে তোলে।


3
আমার বইয়ের মধ্যে এইচএফস্লি'র সর্বাধিক মার্জিত উত্তর। প্লাস আমি সবেমাত্র শিখেছি আপনি এতে নিয়মিত প্রকাশ করতে পারেন stringByReplacingOccurrencesOfString:। বিশ্বাস করতে পারি না আমি তা জানতাম না।
ডেভিডফ 2281

1
অসাধারণ. মনোমুগ্ধকর মতো কাজ করেছেন
কুশল অশোক

41

আসলে, এর খুব সহজ সমাধান রয়েছে:

NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)

( উত্স )


29
আমি মনে করি এটি কেবলমাত্র শীর্ষস্থানীয় এবং পিছনের স্থানগুলি দূর করবে এবং সেগুলি সমস্ত দূর করবে। এটি "হ্যালো
ফু

2
ডি * এমএন লাইন শেষ এবং অটো-ফর্ম্যাট ... এটি "হ্যালো ______foo" (ধরুন _ -> "" কারন বিন্যাস করা কঠিন কারণ)
ব্রায়ান পোস্তো

32
আপনি কেন লোকেরা ভোট দিয়েছিলেন এবং এমন প্রশ্নের উত্তর দেয় যা প্রশ্নের সমাধান দেয় না? স্ট্রিংবাই ট্রাইমিংচ্যাকার্টারসআইনসেট স্ট্রিংয়ের আইসাইডটি কেবল বিশ্লেষণ করে না বা কিনে দেয়। জর্জি শোলির উত্তর সঠিক।
লুকাশজ

3
প্রশ্নের ঠিক উত্তর ছিল না, তবে এটি অবশ্যই আমাকে সাহায্য করেছিল। ধন্যবাদ
daveMac

1
একই সাথে নেতৃস্থানীয় এবং পিছনে স্থান সরিয়ে দেওয়ার জন্য দুর্দান্ত কোড।
ব্যবহারকারী523234

13

একটি রেজেক্স সহ, তবে কোনও বাহ্যিক কাঠামোর প্রয়োজন ছাড়াই:

NSString *theString = @"    Hello      this  is a   long       string!   ";

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];

এরপরেও আপনাকে ফলাফলটি ছাঁটাই করতে হবে, অথবা আপনাকে সাদা স্থান দিয়ে আবদ্ধ করা হবে। যদিও এটি সম্ভবত সবচেয়ে সহজ উত্তর।
লিলবির্ডি

2
এর জন্য ডকুমেন্টেশনটি NSRegularExpressionSearchবলে যে এটি কেবল rangeOfString:...পদ্ধতিগুলির
সাথেই

9

একটি ওয়ান লাইন সমাধান:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];

2
আমাকে সাহায্য করেছেন :)। তার জন্য ধন্যবাদ!
অধ্যয়ন

5
এটি দরকারী, এটি সমস্ত সাদা স্থান সরিয়ে দেয়। ওপি মূলত হোয়াইটস্পেস সংযোগ চায়, উদাহরণস্বরূপ একটি ট্রিম যার পরে একক শ্বেত স্পেসে একটানা হোয়াইটস্পেস হ্রাস করা যায়।
লিলবির্ডি

অন্য দ্রষ্টব্য, এই সমাধানটি ট্যাব বা নিউলাইনগুলি বা স্পেস ব্যতীত হোয়াইটস্পেস অক্ষরগুলির সাথে কোনও চুক্তি করে না।
fwelstra

2
এই ওপি জবাব দিতে পারে নি, কিন্তু এর পরিবর্তে স্ট্রিং সব শূণ্যস্থান সরিয়ে ফেলা হবে, তাই আপনি দিয়ে শেষ @ "Stringwithwhitespaces"
চার্লস

6

এটি করা উচিত ...

NSString *s = @"this is    a  string    with lots  of     white space";
NSArray *comps = [s componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSMutableArray *words = [NSMutableArray array];
for(NSString *comp in comps) {
  if([comp length] > 1)) {
    [words addObject:comp];
  }
}

NSString *result = [words componentsJoinedByString:@" "];

1
এটি আসলে 'এ' স্ট্রিংয়ের সাথে কাজ করে? এটা তোলে, দৈর্ঘ্য 1 এর যতদূর আমি দেখতে পারেন, এই সমাধান আকার 0 এবং 1 এর সঙ্গে সমস্ত বিভক্ত শব্দ ফিল্টার হবে
fwielstra

হ্যাঁ এই উত্তরটির আমি প্রত্যাশা করছিলাম। ধন্যবাদ + 1
पवन


3

এটা চেষ্টা কর

NSString *theString = @"    Hello      this  is a   long       string!   ";

while ([theString rangeOfString:@"  "].location != NSNotFound) {
    theString = [theString stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}

3

এখানে একটি থেকে একটি স্নিপেট এর NSStringএক্সটেনশন, যেখানে "self"হয় NSStringউদাহরণস্বরূপ। এটি দুটি আর্গুমেন্টে [NSCharacterSet whitespaceAndNewlineCharacterSet]এবং প্রবেশের মাধ্যমে একক স্পেসে সংকীর্ণ শ্বেত স্থানটি ধসে পড়তে ব্যবহৃত হতে ' 'পারে।

- (NSString *) stringCollapsingCharacterSet: (NSCharacterSet *) characterSet toCharacter: (unichar) ch {
int fullLength = [self length];
int length = 0;
unichar *newString = malloc(sizeof(unichar) * (fullLength + 1));

BOOL isInCharset = NO;
for (int i = 0; i < fullLength; i++) {
    unichar thisChar = [self characterAtIndex: i];

    if ([characterSet characterIsMember: thisChar]) {
        isInCharset = YES;
    }
    else {
        if (isInCharset) {
            newString[length++] = ch;
        }

        newString[length++] = thisChar;
        isInCharset = NO;
    }
}

newString[length] = '\0';

NSString *result = [NSString stringWithCharacters: newString length: length];

free(newString);

return result;
}

-1

বিকল্প সমাধান: নিজেকে ওগ্রেকিটের একটি অনুলিপি (কোকো নিয়মিত এক্সপ্রেশন লাইব্রেরি) পান।

পুরো ফাংশনটি তখন:

NSString *theStringTrimmed =
   [theString stringByTrimmingCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression  *regex =
    [OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);

স্বল্প ও মধুর.

আপনি যদি দ্রুততম সমাধানের পরে থাকেন তবে একটি সাবধানে নির্ধারিত নির্দেশাবলী ব্যবহার করে সিরিজটি NSScannerসম্ভবত সবচেয়ে ভাল কাজ করবে তবে আপনি কেবলমাত্র বিশাল (অনেক মেগাবাইট) ব্লকের পাঠ্যের ব্লক প্রক্রিয়া করার পরিকল্পনা করলে তা কেবল প্রয়োজন হবে।


RegExKitLite এর পরিবর্তে ওগ্রেকিট ব্যবহার করার কোনও কারণ আছে কি? regexkit.sourceforge.net এটির খুব একই রকম একটি প্রতিস্থাপনঅ্যাক্সিয়েন্সস অফফিজেক্স কল রয়েছে এবং এটি বিদ্যমান রেজিএক্স লাইব্রেরির শীর্ষে কাজ করে (নিশ্চিত নয় যে ওগ্রে পুরো রেগএক্স ইঞ্জিন বা কি)
কেন্ডাল হেলস্টেটার জেলনার

আমি নিশ্চিত যে দুজনেই কাজ করবে। আমি রেগেক্সকিট ব্যবহার করি নি তবে এটি করা ভাল পরামর্শ। অন্তর্নিহিত লাইব্রেরির উপর ভিত্তি করে লোকদের বেছে নেওয়া উচিত: পিইআরএল-সামঞ্জস্যপূর্ণ পিসি (RegExKitLite) এবং রুবি-সামঞ্জস্যপূর্ণ ওনিগুরুমা (ওগ্রেকিট)।
ম্যাট গালাগার

-1

@ ম্যাথিউ গডার্টের মতে সেরা উত্তর, তবে কিছু লাইন অনুপস্থিত, সমস্ত উত্তর কেবলমাত্র শব্দের মধ্যে স্থান হ্রাস করে, তবে যখন ট্যাবগুলি থাকে বা স্থানের জায়গাতে ট্যাব থাকে, যেমন: "এটি পাঠ্য \ t, এবং between tt এর মধ্যে রয়েছে, সুতরাং "তিনটি লাইন কোডে আমরা করব: স্ট্রিংটি আমরা সাদা স্পেস হ্রাস করতে চাই

NSString * str_aLine = @"    this is text \t , and\tTab between      , so on    ";
// replace tabs to space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
// reduce spaces to one space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@" +" withString:@" "
                                                    options:NSRegularExpressionSearch
                                                      range:NSMakeRange(0, str_aLine.length)];
// trim begin and end from white spaces
str_aLine = [str_aLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

ফলাফল হলো

"this is text , and Tab between , so on"

ট্যাব প্রতিস্থাপন না করে রেজুল হ'ল:

"this is text    , and  Tab between , so on"

-1

আপনি একটি সহজ সময় যুক্তিও ব্যবহার করতে পারেন। সেখানে কোনও রেগেক্স যাদু নেই, তাই সম্ভবত এটি ভবিষ্যতে বোঝা এবং পরিবর্তন করা আরও সহজ is

while([yourNSStringObject replaceOccurrencesOfString:@"  "
                         withString:@" "
                         options:0
                         range:NSMakeRange(0, [yourNSStringObject length])] > 0);

1
প্রশ্নের উত্তর দেয় না :) এটি নেতৃস্থানীয় এবং অনুসরণের সাদা স্থান সরিয়ে দেয় না।
hfossli

-1

প্রয়োজনীয়তার উপর নির্ভর করে দুটি নিয়মিত এক্সপ্রেশন অনুসরণ করা কাজ করবে

  1. @ "+" সাদা স্পেস এবং ট্যাবগুলির সাথে মিলে যাওয়ার জন্য
  2. @ "\\ s {2, white" সাদা স্পেস, ট্যাব এবং লাইন ব্রেকগুলির সাথে মিলে যায়

তারপরে stringByReplacingOccurrencesOfString:withString:options:range:একটি সাদা স্থানের সাথে তাদের প্রতিস্থাপন করতে এনএসআরটিংয়ের উদাহরণ পদ্ধতি প্রয়োগ করুন।

যেমন

[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];

দ্রষ্টব্য: আমি উপরের কার্যকারিতা আইওএস 5.x এবং এর জন্য 'রেজেক্সকিটলাইট' লাইব্রেরি ব্যবহার করিনি।


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

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