Tôi muốn kiểm tra xem một chuỗi cụ thể có được tạo thành không gian không. Nó có thể là bất kỳ số lượng không gian, bao gồm cả số không. Cách tốt nhất để xác định điều đó là gì?Kiểm tra xem một NSString có được tạo ra không gian
Trả lời
NSString *str = @" ";
NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];
if ([[str stringByTrimmingCharactersInSet: set] length] == 0)
{
// String contains only whitespace.
}
Cắt không gian và kiểm tra số ký tự còn lại. Hãy xem bài này here
Hãy thử tước nó không gian và so sánh nó với @ "":
NSString *probablyEmpty = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
BOOL wereOnlySpaces = [probablyEmpty isEqualToString:@""];
Hãy thử điều này:
[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
hoặc
[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Đây là phương thức 'NSMutableString'. –
Um, không phải vậy. Nó trả về một NSString mới và được khai báo trong NSString.h. – picciano
Thực ra nó không được định nghĩa ở bất cứ đâu. –
đây là một danh mục có thể tái sử dụng dễ dàng trên NSString
dựa trên câu trả lời của @Alexander Akers, nhưng cũng trả YES
nếu chuỗi chứa "dòng mới" ...
@interface NSString (WhiteSpaceDetect)
@property (readonly) BOOL isOnlyWhitespace;
@end
@implementation NSString (WhiteSpaceDetect)
- (BOOL) isOnlyWhitespace {
return ![self stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]].length;
}
@end
và cho những người bạn tâm hồn untrusting ngoài kia ..
#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
Đây là một đơn giản Giải pháp 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
}
tại sao bỏ phiếu xuống? – Esqarrouth
Dưới đây là mã phiên bản Swift cho cùng,
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
}
Hoặc bạn có thể viết một phần mở rộng chuỗi đơn giản như dưới đây và sử dụng mã cùng với khả năng đọc tốt hơn ở nhiều nơi.
extension String {
func isEmptyOrContainsOnlySpaces() -> Bool {
return count(self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())) == 0
}
}
và chỉ cần gọi nó bằng bất kỳ chuỗi như thế này,
var str1 = " "
if str.isEmptyOrContainsOnlySpaces() {
// custom code e.g Show an alert
}
Đó là nhanh hơn đáng kể để kiểm tra một loạt các ký tự không phải khoảng trắng thay vì cắt tỉa toàn bộ chuỗi.
NSCharacterSet *inverted = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet];
NSRange range = [string rangeOfCharacterFromSet:inverted];
BOOL empty = (range.location == NSNotFound);
Lưu ý rằng "đã điền" có lẽ là trường hợp phổ biến nhất với sự kết hợp không gian và văn bản.
testSpeedOfSearchFilled - 0.012 sec
testSpeedOfTrimFilled - 0.475 sec
testSpeedOfSearchEmpty - 1.794 sec
testSpeedOfTrimEmpty - 3.032 sec
Thử nghiệm chạy trên iPhone 6+ của tôi. Mã số here. Dán vào bất kỳ lớp con XCTestCase nào.
Câu trả lời này là tốt nhất. Tôi đã thực sự ngạc nhiên khi nhiều người mù quáng đi tìm giải pháp cắt tỉa. Bạn nên sửa chữa một lỗi đánh máy mặc dù: nếu range.location! = NSNotFound nó có nghĩa là bạn đã tìm thấy một char không-WS, có nghĩa là chuỗi không rỗng. Vì vậy, bạn cần phải đảo ngược tình trạng này. – battlmonstr
Phải sử dụng mã này cho Swift 3:
func isEmptyOrContainsOnlySpaces() -> Bool {
return self.trimmingCharacters(in: .whitespaces).characters.count == 0
}
Tôi thực sự ngạc nhiên rằng tôi là người đầu tiên gợi ý Regular Expression
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;
Hoặc trong 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
Tùy thuộc vào tình huống mà người ta có thể muốn sử dụng 'khoảng trắng vàNewlineCharacterSet' thay thế (không exa ctly những gì nó nói trên tin). – BoltClock