2009-04-03 52 views
45

Trong PHP tôi có thể thực hiện việc này:Thay thế nhiều ký tự trong một chuỗi trong Objective-C?

$new = str_replace(array('/', ':', '.'), '', $new); 

... để thay thế tất cả các cá thể của ký tự /:. với một chuỗi trống (để xóa chúng)

Tôi có thể thực hiện điều này dễ dàng trong Mục tiêu-C không? Hay tôi phải tự mình cuộn?

Hiện nay tôi đang làm nhiều cuộc gọi đến stringByReplacingOccurrencesOfString:

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""]; 
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]; 
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""]; 

Cảm ơn,
mờ

Trả lời

118

Một cách nào hiệu quả để làm điều này:

NSString *s = @"foo/bar:baz.foo"; 
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."]; 
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
NSLog(@"%@", s); // => foobarbazfoo 

Nhìn vào NSScanner-[NSString rangeOfCharacterFromSet: ...] nếu bạn muốn làm điều này hiệu quả hơn một chút.

+0

Cảm ơn câu trả lời, sẽ làm –

+0

cảm ơn làm việc như quyến rũ –

27

Có những tình huống mà phương pháp của bạn là đủ tốt Tôi nghĩ rằng mờ .. BTW, tôi nghĩ rằng nó tốt hơn để sử dụng

[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]]; 

hơn

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""]; 

như tôi nghĩ rằng bạn đang ghi đè lên một Con trỏ NSMutableString có NSString có thể gây rò rỉ bộ nhớ.

+0

Cảm ơn Nick - luôn luôn tốt để nghe về các chi tiết nhỏ –

+0

NSString sẽ không phản hồi setString. – fuzz

+0

Nhưng NSMutableString có đúng không? –

2
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str 
{ 
    NSMutableString* string = [[NSMutableString alloc] initWithString:str]; // #&39; replace with ' 
    NSString* unicodeStr = nil; 
    NSString* replaceStr = nil; 
    int counter = -1; 

    for(int i = 0; i < [string length]; ++i) 
    { 
     unichar char1 = [string characterAtIndex:i]; 
     for (int k = i + 1; k < [string length] - 1; ++k) 
     { 
      unichar char2 = [string characterAtIndex:k]; 

      if (char1 == '&' && char2 == '#') 
      { 
       ++counter; 
       unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39 
       replaceStr = [string substringWithRange:NSMakeRange (i, 5)]; // #&39; 
       [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]]; 
       break; 
      } 
     } 
    } 

    [string autorelease]; 

    if (counter > 1) 
     return [self decodeHtmlUnicodeCharactersToString:string]; 
    else 
     return string; 
} 
+0

Vui lòng định dạng bình luận của bạn với các thẻ mã –

1

Nếu các ký tự bạn muốn loại bỏ là để được tiếp giáp với nhau, bạn có thể sử dụng

stringByReplacingCharactersInRange:(NSRange) withString:(NSString *) 

Khác hơn thế, tôi nghĩ rằng chỉ sử dụng các chức năng tương tự nhiều lần không phải là xấu . Nó dễ đọc hơn nhiều so với việc tạo ra một phương pháp lớn để làm tương tự theo cách tổng quát hơn.

5

Về cơ bản giống như Nicholas đã đăng ở trên, nhưng nếu bạn muốn xóa mọi thứ XÁC NHẬN một tập hợp các ký tự (nói rằng bạn muốn xóa mọi thứ không có trong tập hợp "ABCabc123") thì bạn có thể làm như sau:

NSString *s = @"A567B$%C^.123456abcdefg"; 
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet]; 
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
NSLog(@"%@", s); // => ABC123abc 

Hữu ích khi loại bỏ các biểu tượng và như vậy, nếu bạn chỉ muốn chữ và số.

6

Đã phải làm điều này thời gian gần đây và muốn chia sẻ một phương pháp hiệu quả:

(giả sử someText là một NSString hoặc thuộc tính văn bản)

NSString* someText = @"1232342jfahadfskdasfkjvas12!"; 

(ví dụ này sẽ dải số từ một chuỗi)

[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])]; 

Hãy nhớ rằng bạn sẽ cần phải thoát khỏi ký tự regex bằng ký tự thoát Obj-c:

(obj-c sử dụng một dấu gạch chéo kép để thoát literals regex đặc biệt)

...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]" 

Điều gì làm thú vị này là NSRegularExpressionSearch tùy chọn rất ít được sử dụng nhưng có thể dẫn đến một số kiểm soát rất mạnh mẽ:

Bạn có thể tìm hướng dẫn chi tiết về iOS regex here và hơn thế nữa ở các cụm từ thông dụng tại regex101.com

+0

Giải pháp rất hay. –

1

Đây là ví dụ trong Swift 3 sử dụng tùy chọn regularExpression thay thếChi tiết.

Sử dụng thay thếOccurrences cùng với tùy chọn String.CompareOptions.regularExpression.

Ví dụ (Swift 3):

var x = "<Hello, [play^ground+]>" 
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil) 
print(y) 

Output:

7Hello, 7play7ground777 
1

Tạo một phần mở rộng vào chuỗi ...

extension String { 

    func replacingOccurrences(of strings:[String], with replacement:String) -> String { 
     var newString = self 
     for string in strings { 
      newString = newString.replacingOccurrences(of: string, with: replacement) 
     } 
     return newString 
    } 

} 

Gọi nó như thế này:

aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"") 
Các vấn đề liên quan