Xóa tất cả các khoảng trắng khỏi NSString


134

Tôi đã cố gắng loại bỏ các khoảng trắng trong một NSString, nhưng không có phương pháp nào tôi đã thử làm việc.

Tôi có "this is a test"và tôi muốn có được "thisisatest".

Tôi đã sử dụng whitespaceCharacterSet, được cho là để loại bỏ khoảng trắng.

NSString *search = [searchbar.text stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceCharacterSet]];

nhưng tôi tiếp tục nhận được cùng một chuỗi với khoảng trắng. Có ý kiến ​​gì không?


2
Không có cách nào đơn giản, nhưng liên kết này có câu trả lời tuyệt vời - stackoverflow.com/questions/758212/iêu
Cà phê

2
@Adel Nhưng, không có câu trả lời nào được chấp nhận =)
Almas Adilbek

Câu trả lời:


303

stringByTrimmingCharactersInSet chỉ loại bỏ các ký tự từ đầu và cuối chuỗi, không loại bỏ các ký tự ở giữa.

1) Nếu bạn chỉ cần xóa một ký tự đã cho (nói ký tự khoảng trắng) khỏi chuỗi của mình, hãy sử dụng:

[yourString stringByReplacingOccurrencesOfString:@" " withString:@""]

2) Nếu bạn thực sự cần xóa một bộ ký tự (không chỉ là ký tự khoảng trắng, mà bất kỳ ký tự khoảng trắng nào như dấu cách, tab, khoảng trắng không thể phá vỡ, v.v.), bạn có thể tách chuỗi của mình bằng cách whitespaceCharacterSetnối lại các từ trong một chuỗi :

NSArray* words = [yourString componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString* nospacestring = [words componentsJoinedByString:@""];

Lưu ý rằng giải pháp cuối cùng này có lợi thế là xử lý mọi ký tự khoảng trắng và không chỉ khoảng trắng, mà còn kém hiệu quả hơn một chút stringByReplacingOccurrencesOfString:withString:. Vì vậy, nếu bạn thực sự chỉ cần xóa ký tự khoảng trắng và chắc chắn rằng bạn sẽ không có bất kỳ ký tự khoảng trắng nào khác ngoài char không gian đơn giản, hãy sử dụng phương thức đầu tiên.


Tuyệt vời! Cảm ơn rất nhiều!
iGatiTech

33

Tôi thích sử dụng regex như thế này:

NSString *myString = @"this is a test";
NSString *myNewString = [myString stringByReplacingOccurrencesOfString:@"\\s"
                                     withString:@""
                                        options:NSRegularExpressionSearch
                                          range:NSMakeRange(0, [myStringlength])];
 //myNewString will be @"thisisatest"

Bạn có thể biến mình thành một danh mục trên NSString để giúp cuộc sống trở nên dễ dàng hơn:

- (NSString *) removeAllWhitespace
{
    return [self stringByReplacingOccurrencesOfString:@"\\s" withString:@""
                                              options:NSRegularExpressionSearch
                                                range:NSMakeRange(0, [self length])];

}

Đây là một phương pháp thử nghiệm đơn vị trên đó:

- (void) testRemoveAllWhitespace
{
    NSString *testResult = nil;

    NSArray *testStringsArray        = @[@""
                                         ,@"    "
                                         ,@"  basicTest    "
                                         ,@"  another Test \n"
                                         ,@"a b c d e f g"
                                         ,@"\n\tA\t\t \t \nB    \f  C \t  ,d,\ve   F\r\r\r"
                                         ,@"  landscape, portrait,     ,,,up_side-down   ;asdf;  lkjfasdf0qi4jr0213 ua;;;;af!@@##$$ %^^ & *  * ()+  +   "
                                         ];

    NSArray *expectedResultsArray   = @[@""
                                        ,@""
                                        ,@"basicTest"
                                        ,@"anotherTest"
                                        ,@"abcdefg"
                                        ,@"ABC,d,eF"
                                        ,@"landscape,portrait,,,,up_side-down;asdf;lkjfasdf0qi4jr0213ua;;;;af!@@##$$%^^&**()++"
                                        ];

    for (int i=0; i < [testStringsArray count]; i++)
    {
        testResult = [testStringsArray[i] removeAllWhitespace];
        STAssertTrue([testResult isEqualToString:expectedResultsArray[i]], @"Expected: \"%@\" to become: \"%@\", but result was \"%@\"",
                     testStringsArray[i], expectedResultsArray[i], testResult);
    }
}

2
Người đàn ông, tôi thích điều này bao gồm đơn vị thử nghiệm kinh doanh. Bây giờ tôi không chỉ có thể sao chép-dán mã của mình từ SO, mà tôi còn có thể sao chép-dán các bài kiểm tra cho mã đó!
TylerJames

13

Nhiệm vụ dễ dàng sử dụng stringByReplacingOccurrencesOfString

NSString *search = [searchbar.text stringByReplacingOccurrencesOfString:@" " withString:@""];

1
Tuy nhiên, đồng ý chỉ khi bạn không cần bộ khoảng trắng. Tôi sẽ sử dụng nó, nhưng sau đó nhận ra tôi có dòng mới trong chuỗi của mình.
mobibob

7

Điều này có thể giúp bạn nếu bạn đang trải nghiệm \u00a0thay cho (khoảng trắng). Tôi gặp vấn đề này khi tôi đang cố trích xuất số điện thoại liên hệ của thiết bị. Tôi cần sửa đổi chuỗi phoneNumber để nó không có khoảng trắng trong đó.

NSString* yourString = [yourString stringByReplacingOccurrencesOfString:@"\u00a0" withString:@""];

Khi nào yourStringlà số điện thoại hiện tại.


Điều này đã giúp một tấn! Tôi đã bị mắc kẹt trên đó quá! Cám ơn nhiều, ông bạn! : D
Rafi

Đối với swift 3, bạn có thể sử dụngyourString.replacingOccurrences(of: "\u{00a0}", with: "")
Okhan Okbay 17/07/17

4

stringByReplacesOccurrencesOfString sẽ thay thế tất cả khoảng trắng bằng trong chuỗi không chỉ bắt đầu và kết thúc

Sử dụng

[YourString stringByTrimmingCharactersInSet:[NSCharacterSet  whitespaceAndNewlineCharacterSet]]

5
bạn nói để sử dụng stringByReplacingOccurrencesOfStringnhưng cho một ví dụ về stringByTrimmingCharactersInSet?
Flexicoder

4
- (NSString *)removeWhitespaces {
  return [[self componentsSeparatedByCharactersInSet:
                    [NSCharacterSet whitespaceCharacterSet]]
      componentsJoinedByString:@""];
}

Trong khi mã này có thể giải quyết vấn đề, một vài lời giải thích sẽ đi một chặng đường dài để làm cho câu trả lời này có giá trị cho độc giả tương lai.
Thơm

4

Điều này đối với tôi là cách tốt nhất

        let myString = "  ciao   \n              ciao     "
        var finalString = myString as NSString

        for character in myString{
        if character == " "{

            finalString = finalString.stringByReplacingOccurrencesOfString(" ", withString: "")

        }else{
            finalString = finalString.stringByReplacingOccurrencesOfString("\n", withString: "")

        }

    }
     println(finalString)

và kết quả là: ciaociao

Nhưng mẹo là thế này!

 extension String {

    var NoWhiteSpace : String {

    var miaStringa = self as NSString

    if miaStringa.containsString(" "){

      miaStringa =  miaStringa.stringByReplacingOccurrencesOfString(" ", withString: "")
    }
        return miaStringa as String

    }
}

let myString = "Ciao   Ciao       Ciao".NoWhiteSpace  //CiaoCiaoCiao

4

Sử dụng bên dưới marco và loại bỏ không gian.

#define TRIMWHITESPACE(string) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]

trong tập tin khác gọi TRIM:

    NSString *strEmail;
    strEmail = TRIM(@"     this is the test.");

Có thể nó sẽ giúp bạn ...


3

Đó là để xóa bất kỳ khoảng trắng nào khi bạn nhận văn bản từ bất kỳ trường văn bản nào nhưng nếu bạn muốn xóa khoảng trắng giữa chuỗi, bạn có thể sử dụng

xyz =[xyz.text stringByReplacingOccurrencesOfString:@" " withString:@""];

Nó sẽ thay thế không gian trống không có không gian và trường trống được chăm sóc bằng phương pháp dưới đây:

searchbar.text=[searchbar.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];

-1
pStrTemp = [pStrTemp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Xin vui lòng, giải thích một chút về những gì đoạn trích này làm và sửa định dạng của nó.
Yurii

-2

Tôi thực sự khuyên bạn nên đặt cái này ở đâu đó trong dự án của bạn:

extension String {
    func trim() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }

    func trim(withSet: NSCharacterSet) -> String {
        return self.stringByTrimmingCharactersInSet(withSet)
    }
}

1
Đây không phải là một câu trả lời cho câu hỏi.
Ben Lachman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.