【发布时间】:2011-11-08 16:14:06
【问题描述】:
我想检查一个特定的字符串是否只是由空格组成的。它可以是任意数量的空格,包括零。确定它的最佳方法是什么?
【问题讨论】:
标签: objective-c string cocoa-touch cocoa nsstring
我想检查一个特定的字符串是否只是由空格组成的。它可以是任意数量的空格,包括零。确定它的最佳方法是什么?
【问题讨论】:
标签: objective-c string cocoa-touch cocoa nsstring
NSString *str = @" ";
NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];
if ([[str stringByTrimmingCharactersInSet: set] length] == 0)
{
// String contains only whitespace.
}
【讨论】:
whitespaceAndNewlineCharacterSet 代替(完全按照它在锡上所说的那样做)。
修剪空格并检查剩余的字符数。看看这个帖子here
【讨论】:
尝试去掉空格并将其与@"":
NSString *probablyEmpty = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
BOOL wereOnlySpaces = [probablyEmpty isEqualToString:@""];
【讨论】:
试试这个:
[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
或
[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
【讨论】:
NSMutableString 方法。
根据@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
【讨论】:
这是一个简单的 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
}
【讨论】:
这是相同的 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
}
或者您可以编写一个简单的字符串扩展,如下所示,并在多个地方使用具有更好可读性的相同代码。
extension String {
func isEmptyOrContainsOnlySpaces() -> Bool {
return count(self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0
}
}
然后使用任何这样的字符串调用它,
var str1 = " "
if str.isEmptyOrContainsOnlySpaces() {
// custom code e.g Show an alert
}
【讨论】:
检查非空白字符的范围比修剪整个字符串要快得多。
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 子类中。
【讨论】:
必须将此代码用于 Swift 3:
func isEmptyOrContainsOnlySpaces() -> Bool {
return self.trimmingCharacters(in: .whitespaces).characters.count == 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;
或者在 Swift 中:
let string = " "
let pattern = "^\\s*$"
let expression = try! NSRegularExpression(pattern:pattern)
let matches = expression.matches(in: string, range: NSRange(string.startIndex..., in: string))
let isOnlyWhitespace = !matches.isEmpty
或者
let string = " "
let isOnlyWhitespace = string.range(of: "^\\s*$", options: .regularExpression) != nil
【讨论】: