2011-09-01 56 views

回答

101
NSString *str = @"   "; 
NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; 
if ([[str stringByTrimmingCharactersInSet: set] length] == 0) 
{ 
    // String contains only whitespace. 
} 
+21

取決於情況,人們可能想使用'whitespaceAndNelinelineCharacterSet'來代替(exa只是它在錫上所說的)。 – BoltClock

0

修整空間並檢查剩餘字符的數量。看看這個帖子here

8

嘗試剝離它的空間,並將其與@ 「」:

NSString *probablyEmpty = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
BOOL wereOnlySpaces = [probablyEmpty isEqualToString:@""]; 
2

試試這個:

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
+0

這是一個'NSMutableString'方法。 –

+5

恩,不,它不是。它返回一個新的NSString並在NSString.h中聲明。 – picciano

+0

其實它並沒有在任何地方定義。 –

0

這裏是基於@Alexander Akers的答案的NSString上的一個易於重用的類別,但這也是返回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 
-1

下面是一個簡單的迅捷解決方案:

//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

爲什麼投了票? – Esqarrouth

-1

下面是相同的雨燕版本代碼,

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 
} 

或者你可以寫一個簡單的字符串擴展如下圖所示,並使用相同的代碼與在多個位置更好的可讀性。

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

,只是把它用這樣的任意字符串,

var str1 = " " 
if str.isEmptyOrContainsOnlySpaces() { 
    // custom code e.g Show an alert 
} 
7

這是顯著快檢查的非空格字符,而不是微調整個字符串的範圍。

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+上運行。 代碼here。粘貼到任何XCTestCase子類中。

+2

這個答案是迄今爲止最好的。我真的很驚訝,有那麼多人盲目地去修剪解決方案。你應該修正一個拼寫錯誤:如果range.location!= NSNotFound,這意味着你已經找到了非WS字符,這意味着字符串不是空的。所以你需要反轉條件。 – battlmonstr

0

不得不使用雨燕3驗證碼:

func isEmptyOrContainsOnlySpaces() -> Bool { 

    return self.trimmingCharacters(in: .whitespaces).characters.count == 0 
} 
0

我真的很驚訝,我是第一個誰提出正則表達式

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; 

還是在斯威夫特:

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