web-dev-qa-db-ja.com

NSStringがスペースでできているかどうかを確認します

特定の文字列がスペースのみで構成されているかどうかを確認したい。ゼロを含む任意の数のスペースを使用できます。それを決定する最良の方法は何ですか?

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

スペースを取り除き、@ ""と比較してみてください。

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

文字列全体をトリミングするよりも、空白以外の文字の範囲をチェックする方がはるかに高速です。

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
arsenius

これを試して:

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

または

[mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
2
picciano

私が正規表現を提案する最初の人であることに本当に驚いています

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
2
vadian

Swift 3の場合はこのコードを使用する必要があります:

func isEmptyOrContainsOnlySpaces() -> Bool {

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

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
}
0
Rameswar Prasad

スペースをトリミングし、残りの文字数を確認します。この投稿を見てください ここ

0
James Raitsev

@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
0
Alex Gray