Проверьте, состоит ли просто NSString из пробелов - PullRequest
48 голосов
/ 01 сентября 2011

Я хочу проверить, состоит ли конкретная строка из пробелов. Это может быть любое количество пробелов, включая ноль. Каков наилучший способ определить это?

Ответы [ 10 ]

105 голосов
/ 01 сентября 2011
NSString *str = @"         ";
NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];
if ([[str stringByTrimmingCharactersInSet: set] length] == 0)
{
    // String contains only whitespace.
}
8 голосов
/ 22 апреля 2016

Значительно быстрее проверять диапазон непробельных символов, а не обрезать всю строку.

NSCharacterSet *inverted = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet];
NSRange range = [string rangeOfCharacterFromSet:inverted];
BOOL empty = (range.location == NSNotFound);

Обратите внимание, что «заполненный», вероятно, наиболее распространенный случай со смесью пробелов и текста..

testSpeedOfSearchFilled - 0.012 sec
testSpeedOfTrimFilled - 0.475 sec
testSpeedOfSearchEmpty - 1.794 sec
testSpeedOfTrimEmpty - 3.032 sec

На моем iPhone 6+ выполняются тесты.Код здесь .Вставьте в любой подкласс XCTestCase.

8 голосов
/ 01 сентября 2011

Попробуйте убрать пробелы и сравнить их с @ "":

NSString *probablyEmpty = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
BOOL wereOnlySpaces = [probablyEmpty isEqualToString:@""];
2 голосов
/ 01 сентября 2011

Попробуйте это:

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

или

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
1 голос
/ 15 февраля 2017

Я действительно удивлен, что я первый, кто предлагает Регулярное выражение

NSString *string = @"         ";
NSString *pattern = @"^\\s*$";
NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
NSArray *matches = [expression matchesInString:string options:0 range:NSMakeRange(0, string.length)];
BOOL isOnlyWhitespace = matches.count;

Или в Swift:

let string = "         "
let pattern = "^\\s*$"
let expression = try! NSRegularExpression(pattern:pattern, options:[])
let matches = expression.matches(in: string, options: [], range:NSRange(location: 0, length: string.utf16.count))
let isOnlyWhitespace = !matches.isEmpty
0 голосов
/ 15 февраля 2017

Придется использовать этот код для Swift 3:

func isEmptyOrContainsOnlySpaces() -> Bool {

    return self.trimmingCharacters(in: .whitespaces).characters.count == 0
}
0 голосов
/ 18 августа 2015

Вот код версии Swift для того же,

var str = "Hello World" 
if count(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0 {
     // String is empty or contains only white spaces
}
else {
    // String is not empty and contains other characters
}

Или вы можете написать простое расширение String, как показано ниже, и использовать один и тот же код с лучшей читаемостью в нескольких местах.

extension String {
    func isEmptyOrContainsOnlySpaces() -> Bool {
        return count(self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0
    }
}

и просто вызывайте его, используя любую строку, подобную этой,

var str1 = "   "
if str.isEmptyOrContainsOnlySpaces() {
    // custom code e.g Show an alert
}
0 голосов
/ 08 марта 2015

Вот простое решение Swift:

//Check if string contains only empty spaces and new line characters
static func isStringEmpty(#text: String) -> Bool {
    let characterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet()
    let newText = text.stringByTrimmingCharactersInSet(characterSet)
    return newText.isEmpty
}
0 голосов
/ 22 мая 2014

Это категория, которую можно многократно использовать на NSString на основе ответа @Alexander Akers, но она также возвращает YES, если строка содержит «новые строки» ...

@interface NSString (WhiteSpaceDetect)
@property (readonly) BOOL isOnlyWhitespace;
@end
@implementation NSString (WhiteSpaceDetect)
- (BOOL) isOnlyWhitespace { 
  return ![self stringByTrimmingCharactersInSet:
          [NSCharacterSet whitespaceAndNewlineCharacterSet]].length;
}
@end

и дляте из вас, недоверчивые души там ..

#define WHITE_TEST(x) for (id z in x) printf("\"%s\" : %s\n",[z UTF8String], [z isOnlyWhitespace] ? "YES" :"NO")

WHITE_TEST(({ @[

    @"Applebottom",
    @"jeans\n",
    @"\n",
    @""
    "",
    @"   \
    \
    ",
    @"   "
];}));

"Applebottom" : NO
"jeans
" : NO
"
" : YES
"" : YES
"   " : YES
"   " : YES
0 голосов
/ 01 сентября 2011

Обрезать пробел и проверять количество оставшихся символов.Взгляните на этот пост здесь

...