কিছু ফোন নম্বর বিন্যাসিত হওয়ায় আমার কাছে একটি এনএসএসস্ট্রিং (ফোন নম্বর) রয়েছে parent আমি স্ট্রিং থেকে সংখ্যা বাদে সমস্ত অক্ষরকে কীভাবে সরিয়ে ফেলব?
কিছু ফোন নম্বর বিন্যাসিত হওয়ায় আমার কাছে একটি এনএসএসস্ট্রিং (ফোন নম্বর) রয়েছে parent আমি স্ট্রিং থেকে সংখ্যা বাদে সমস্ত অক্ষরকে কীভাবে সরিয়ে ফেলব?
উত্তর:
পুরানো প্রশ্ন, তবে কীভাবে:
NSString *newString = [[origString componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
এটি অ-অঙ্কের সেটটিতে উত্সের স্ট্রিংটি বিস্ফোরিত করে, তারপরে খালি স্ট্রিং বিভাজক ব্যবহার করে তাদের পুনরায় সংযুক্ত করে। অক্ষরগুলির মাধ্যমে বাছাইয়ের মতো দক্ষ নয়, কোডে আরও অনেক কমপ্যাক্ট।
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
কাজ করছে না?
[NSCharacterSet decimalDigitCharacterSet]
সাথে প্রতিস্থাপন করবেন যেখানে কেবল সংখ্যা এবং অক্ষর রয়েছে। আপনি একটি তৈরি করে এক গঠন করা যেতে পারে NSMutableCharaterSet
এবং ক্ষণস্থায়ী একটি decimalDigitCharacterSet
, uppercaseLetterCharacterSet
এবং lowercaseLetterCharacterSet
করতে formUnionWithCharacterSet:
। নোট যাতে letterCharacterSet
চিহ্নগুলিও অন্তর্ভুক্ত করে, তাই নিম্ন- এবং বড় হাতের সংস্করণ ব্যবহার।
অন্যান্য উত্তরগুলির হিসাবে নিয়মিত এক্সপ্রেশন লাইব্রেরি ব্যবহার করার দরকার নেই - আপনি যে ক্লাসটির পরে ডাকা হচ্ছে তাকে বলা হচ্ছে NSScanner
। এটি নিম্নলিখিত হিসাবে ব্যবহৃত হয়:
NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString
stringWithCapacity:originalString.length];
NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet
characterSetWithCharactersInString:@"0123456789"];
while ([scanner isAtEnd] == NO) {
NSString *buffer;
if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
[strippedString appendString:buffer];
} else {
[scanner setScanLocation:([scanner scanLocation] + 1)];
}
}
NSLog(@"%@", strippedString); // "123123123"
সম্পাদনা করুন: আমি কোডটি আপডেট করেছি কারণ মূলটি আমার মাথার উপরের অংশে লেখা ছিল এবং আমি অনুভব করেছি যে লোকদের সঠিক দিকে নির্দেশ করা যথেষ্ট enough দেখে মনে হচ্ছে লোকেরা কোডের পরে তারা কেবল তাদের আবেদনে সরাসরি কপি-পেস্ট করতে পারে।
আমি এটিও মেনে নিয়েছি যে মাইকেল পেলজ-শেরম্যানের সমাধান ব্যবহারের চেয়ে উপযুক্ত NSScanner
, সুতরাং আপনি এটি একবার দেখে নিতে পারেন।
গ্রহণযোগ্য উত্তর যা জিজ্ঞাসা করা হচ্ছে তার জন্য ওভারকিল। এটি অনেক সহজ:
NSString *pureNumbers = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
এটি দুর্দান্ত, তবে আইফোন 3.0 এসডিকে কোডটি আমার পক্ষে কাজ করে না।
আপনি এখানে প্রদর্শিত হিসাবে আমি স্ট্রিপ স্ট্রিং সংজ্ঞায়িত BAD ACCESS error
করলে, scanCharactersFromSet:intoString
কল করার পরে এটি মুদ্রণের চেষ্টা করার সময় আমি একটি পাই ।
যদি আমি এটির মতো করে করি:
NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];
আমি একটি খালি স্ট্রিং দিয়ে শেষ করি, তবে কোডটি ক্রাশ হয় না।
পরিবর্তে আমাকে ভাল পুরানো সি অবলম্বন করতে হয়েছিল:
for (int i=0; i<[phoneNumber length]; i++) {
if (isdigit([phoneNumber characterAtIndex:i])) {
[strippedString appendFormat:@"%c",[phoneNumber characterAtIndex:i]];
}
}
যদিও এটি কাজের উত্তরগুলির সাথে একটি পুরানো প্রশ্ন, তবে আমি আন্তর্জাতিক ফর্ম্যাট সমর্থনটি মিস করেছি । সিমোনবোর সমাধানের ভিত্তিতে, পরিবর্তিত অক্ষর সেটটিতে একটি যোগ চিহ্ন "+" অন্তর্ভুক্ত থাকে। আন্তর্জাতিক ফোন নম্বরগুলিও এই সংশোধনীর দ্বারা সমর্থিত।
NSString *condensedPhoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:
[[NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]
invertedSet]]
componentsJoinedByString:@""];
সুইফ্ট এক্সপ্রেশন হয়
var phoneNumber = " +1 (234) 567-1000 "
var allowedCharactersSet = NSMutableCharacterSet.decimalDigitCharacterSet()
allowedCharactersSet.addCharactersInString("+")
var condensedPhoneNumber = phoneNumber.componentsSeparatedByCharactersInSet(allowedCharactersSet.invertedSet).joinWithSeparator("")
যা সাধারণ আন্তর্জাতিক ফোন নম্বর ফর্ম্যাট হিসাবে +12345671000 দেয়।
এটির সুইফ্ট সংস্করণ এখানে।
import UIKit
import Foundation
var phoneNumber = " 1 (888) 555-5551 "
var strippedPhoneNumber = "".join(phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))
সর্বাধিক জনপ্রিয় উত্তরের সুইফ্ট সংস্করণ:
var newString = join("", oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))
সম্পাদনা: সুইফট 2-এর সিনট্যাক্স
let newString = oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
সম্পাদনা করুন: সুইফ্ট 3-এর সিনট্যাক্স
let newString = oldString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
উদাহরণের জন্য ধন্যবাদ। অরিজিনাল স্ট্রিংয়ের একটি অক্ষর যদি চরিত্রসেট অবজেক্টের সংখ্যার মধ্যে না পাওয়া যায় তবে এটিতে কেবলমাত্র একটি জিনিস স্ক্যানের লোকেশন বৃদ্ধি পাচ্ছে missing আমি এটি ঠিক করতে অন্য একটি}} বিবৃতি যুক্ত করেছি।
NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString
stringWithCapacity:originalString.length];
NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet
characterSetWithCharactersInString:@"0123456789"];
while ([scanner isAtEnd] == NO) {
NSString *buffer;
if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
[strippedString appendString:buffer];
}
// --------- Add the following to get out of endless loop
else {
[scanner setScanLocation:([scanner scanLocation] + 1)];
}
// --------- End of addition
}
NSLog(@"%@", strippedString); // "123123123"
এটি লক্ষণীয় যে গ্রহণযোগ্য componentsSeparatedByCharactersInSet:
এবং componentsJoinedByString:
ভিত্তিক উত্তর কোনও মেমরি-দক্ষ সমাধান নয় worth এটি অক্ষর সেট, একটি অ্যারের জন্য এবং একটি নতুন স্ট্রিংয়ের জন্য মেমরি বরাদ্দ করে। এগুলি কেবলমাত্র অস্থায়ী বরাদ্দ থাকলেও, প্রচুর পরিমাণে স্ট্রিং প্রক্রিয়াজাতকরণ দ্রুত মেমরিটি পূরণ করতে পারে।
একটি মেমরি বন্ধুত্বপূর্ণ পদ্ধতির জায়গায় স্ট্রিংয়ের মিউটেবল কপি চালনা করা হবে। এনএসএসস্ট্রিংয়ের উপর একটি বিভাগে:
-(NSString *)stringWithNonDigitsRemoved {
static NSCharacterSet *decimalDigits;
if (!decimalDigits) {
decimalDigits = [NSCharacterSet decimalDigitCharacterSet];
}
NSMutableString *stringWithNonDigitsRemoved = [self mutableCopy];
for (CFIndex index = 0; index < stringWithNonDigitsRemoved.length; ++index) {
unichar c = [stringWithNonDigitsRemoved characterAtIndex: index];
if (![decimalDigits characterIsMember: c]) {
[stringWithNonDigitsRemoved deleteCharactersInRange: NSMakeRange(index, 1)];
index -= 1;
}
}
return [stringWithNonDigitsRemoved copy];
}
দুটি পদ্ধতির প্রোফাইলিং প্রায় 2/3 কম মেমরি ব্যবহার করে এটি দেখিয়েছে।
বিস্তৃত সমস্যাগুলির সাথে সহায়তা করার জন্য শীর্ষ সমাধানটি বিভাগ হিসাবে তৈরি করুন:
ইন্টারফেস:
@interface NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set
with:(NSString *)string;
@end
Implemenation:
@implementation NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set
with:(NSString *)string
{
NSMutableString *strippedString = [NSMutableString
stringWithCapacity:self.length];
NSScanner *scanner = [NSScanner scannerWithString:self];
while ([scanner isAtEnd] == NO) {
NSString *buffer;
if ([scanner scanCharactersFromSet:set intoString:&buffer]) {
[strippedString appendString:buffer];
} else {
[scanner setScanLocation:([scanner scanLocation] + 1)];
[strippedString appendString:string];
}
}
return [NSString stringWithString:strippedString];
}
@end
ব্যবহার:
NSString *strippedString =
[originalString stringByReplacingCharactersNotInSet:
[NSCharacterSet setWithCharactersInString:@"01234567890"
with:@""];
দ্রুত 4.1
var str = "75003 Paris, France"
var stringWithoutDigit = (str.components(separatedBy:CharacterSet.decimalDigits)).joined(separator: "")
print(stringWithoutDigit)
উম। প্রথম উত্তরটি আমার কাছে সম্পূর্ণ ভুল বলে মনে হচ্ছে। এনএসএস স্ক্যানারটি সত্যই পার্সিংয়ের জন্য বোঝানো হয়েছে। রেজেক্সের বিপরীতে, এটিতে আপনি একবারে স্ট্রিংকে একটি ক্ষুদ্র অংশকে বিশ্লেষণ করে চলেছেন। আপনি এটি একটি স্ট্রিং দিয়ে সূচনা করেন এবং এটি স্ট্রিংটি কতটা পারা গেছে তার একটি সূচক বজায় রাখে; এই সূচকটি সর্বদা এর রেফারেন্স পয়েন্ট হয় এবং আপনি যে কোনও আদেশ দেন তা সেই বিন্দুটির সাথে সম্পর্কিত। আপনি এটিকে বলছেন, "ঠিক আছে, আমাকে এই সেটটিতে পরবর্তী অক্ষরগুলি দিন" বা "স্ট্রিংয়ের মধ্যে আপনি যে পূর্ণসংখ্যার সন্ধান করেন আমাকে দিন" এবং যেগুলি বর্তমান সূচীতে শুরু হয় এবং যতক্ষণ না তাদের কিছু খুঁজে পায় ততক্ষণ এগিয়ে চলে যান ম্যাচ. যদি ইতিমধ্যে প্রথম অক্ষরটি মেলে না, তবে পদ্ধতিটি কোনও উত্তর দেয় না, এবং সূচকটি বৃদ্ধি পায় না।
প্রথম উদাহরণের কোডটি হ'ল দশমিক অক্ষরের জন্য "(123) 456-7890" স্ক্যান করছে, যা ইতিমধ্যে প্রথম অক্ষর থেকে ব্যর্থ হয়েছে, সুতরাং স্ক্যানচ্যাকারফ্রেমসেটকে কল করুন: স্ট্রিং: পাস-ইন স্ট্রিপ স্ট্রিংকে একা ফেলে দেয় এবং কোনও কিছুই ফেরত দেয় না; কোডটি সম্পূর্ণরূপে রিটার্ন মানটি পরীক্ষা করে উপেক্ষা করে স্ট্রাইপ স্ট্রিংকে নিযুক্ত করে রেখে। এমনকি যদি প্রথম অক্ষরটি একটি অঙ্ক ছিল, তবে সেই কোডটি ব্যর্থ হবে, যেহেতু এটি কেবল প্রথম ড্যাশ বা পেরেন বা যে কোনও কিছু না পাওয়া পর্যন্ত এটি খুঁজে পাওয়া অঙ্কগুলি ফিরিয়ে দেবে।
আপনি যদি সত্যিই এনএসএস স্ক্যানারটি ব্যবহার করতে চান তবে আপনি এটির মতো কোনও কিছু একটি লুপে রাখতে পারেন এবং কোনও কোনও ফেরতের মূল্যের জন্য সন্ধান করতে পারেন এবং যদি আপনি এটি পান যে আপনি স্ক্যানের অবস্থান বাড়িয়ে আবার স্ক্যান করতে পারেন; এবং আপনাকে isAtEnd এবং yada yada yada পরীক্ষা করতে হবে। সংক্ষেপে, কাজের জন্য ভুল সরঞ্জাম। মাইকেল এর সমাধান আরও ভাল।
ফোন এক্সট্রাকশনের জন্য যারা অনুসন্ধান করছেন তাদের জন্য, আপনি এনএসডিটাডেক্টর ব্যবহার করে কোনও পাঠ্য থেকে ফোন নম্বরগুলি বের করতে পারেন, উদাহরণস্বরূপ:
NSString *userBody = @"This is a text with 30612312232 my phone";
if (userBody != nil) {
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error];
NSArray *matches = [detector matchesInString:userBody options:0 range:NSMakeRange(0, [userBody length])];
if (matches != nil) {
for (NSTextCheckingResult *match in matches) {
if ([match resultType] == NSTextCheckingTypePhoneNumber) {
DbgLog(@"Found phone number %@", [match phoneNumber]);
}
}
}
}
`
এই সাধারণ ক্রিয়াকলাপটিকে সহজ করার জন্য আমি এনএসএসটিংয়ে একটি বিভাগ তৈরি করেছি।
@interface NSString (AllowCharactersInSet)
- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet;
@end
@implementation NSString (AllowCharactersInSet)
- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet {
NSMutableString *strippedString = [NSMutableString
stringWithCapacity:self.length];
NSScanner *scanner = [NSScanner scannerWithString:self];
while (!scanner.isAtEnd) {
NSString *buffer = nil;
if ([scanner scanCharactersFromSet:characterSet intoString:&buffer]) {
[strippedString appendString:buffer];
} else {
scanner.scanLocation = scanner.scanLocation + 1;
}
}
return strippedString;
}
@end
আপনি যদি কেবল স্ট্রিং থেকে নম্বরগুলি দখল করতে দেখেন তবে অবশ্যই আপনি তাদের বিশ্লেষণের জন্য নিয়মিত প্রকাশ করতে পারবেন use অবজেক্টিভ-সি-তে রেগেক্স করার জন্য, রেজেক্সকিটটি দেখুন । সম্পাদনা: @ নাথন যেমন উল্লেখ করেছেন, এনএসএস স্ক্যানার ব্যবহার করে স্ট্রিং থেকে সমস্ত সংখ্যাকে পার্স করার সহজ উপায়। আমি এই বিকল্পটি সম্পর্কে পুরোপুরি অবগত ছিলাম না, সুতরাং এটির পরামর্শ দেওয়ার জন্য তাঁর কাছে প্রপস। (আমি নিজেও রেজেক্স ব্যবহার করতে পছন্দ করি না, তাই আমি এমন পদ্ধতির পছন্দ করি যাগুলির প্রয়োজন হয় না))
আপনি যদি প্রদর্শনের জন্য ফোন নম্বরগুলি ফর্ম্যাট করতে চান তবে এনএসএনম্বারফোর্মেটরটি একবার দেখে নেওয়া উচিত । আমি আপনাকে পরামর্শ দিচ্ছি যে এটি সম্পর্কিত টিউসের জন্য আপনি এই সম্পর্কিত এসও প্রশ্নের মাধ্যমে পড়ুন । মনে রাখবেন যে ফোন নম্বরগুলি অবস্থান এবং / অথবা লোকেলের উপর নির্ভর করে আলাদাভাবে ফর্ম্যাট করা আছে।
সুইফট 5
let newString = origString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
এখানে জন ভোগেলের উত্তরের ভিত্তিতে এটি কিছু বেসিক পরীক্ষার পাশাপাশি একটি সুইফ্ট স্ট্রিং এক্সটেনশন হিসাবে।
import Foundation
extension String {
func stringByRemovingNonNumericCharacters() -> String {
return self.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
}
}
এবং কিছু পরীক্ষা অন্তত প্রাথমিক কার্যকারিতা প্রমাণ করে:
import XCTest
class StringExtensionTests: XCTestCase {
func testStringByRemovingNonNumericCharacters() {
let baseString = "123"
var testString = baseString
var newString = testString.stringByRemovingNonNumericCharacters()
XCTAssertTrue(newString == testString)
testString = "a123b"
newString = testString.stringByRemovingNonNumericCharacters()
XCTAssertTrue(newString == baseString)
testString = "a=1-2_3@b"
newString = testString.stringByRemovingNonNumericCharacters()
XCTAssertTrue(newString == baseString)
testString = "(999) 999-9999"
newString = testString.stringByRemovingNonNumericCharacters()
XCTAssertTrue(newString.characters.count == 10)
XCTAssertTrue(newString == "9999999999")
testString = "abc"
newString = testString.stringByRemovingNonNumericCharacters()
XCTAssertTrue(newString == "")
}
}
এটি ওপি-র প্রশ্নের উত্তর দেয় তবে ",; * # +" এর মতো ফোন নম্বর সম্পর্কিত অক্ষরে রেখে সহজেই এটি পরিবর্তন করা যেতে পারে could
NSString *originalPhoneNumber = @"(123) 123-456 abc";
NSCharacterSet *numbers = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
NSString *trimmedPhoneNumber = [originalPhoneNumber stringByTrimmingCharactersInSet:numbers];
];
সহজবোধ্য রাখো!
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]