【问题标题】:Check if an NSString is just made out of spaces检查 NSString 是否只是由空格组成
【发布时间】:2011-11-08 16:14:06
【问题描述】:

我想检查一个特定的字符串是否只是由空格组成的。它可以是任意数量的空格,包括零。确定它的最佳方法是什么?

【问题讨论】:

    标签: objective-c string cocoa-touch cocoa nsstring


    【解决方案1】:
    NSString *str = @"         ";
    NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];
    if ([[str stringByTrimmingCharactersInSet: set] length] == 0)
    {
        // String contains only whitespace.
    }
    

    【讨论】:

    • 视情况而定,您可能希望使用whitespaceAndNewlineCharacterSet 代替(完全按照它在锡上所说的那样做)。
    【解决方案2】:

    修剪空格并检查剩余的字符数。看看这个帖子here

    【讨论】:

      【解决方案3】:

      尝试去掉空格并将其与@"":

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

      【讨论】:

        【解决方案4】:

        试试这个:

        [mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        

        [mystring stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        

        【讨论】:

        • 这是一个NSMutableString 方法。
        • 嗯,不是的。它返回一个新的 NSString 并在 NSString.h 中声明。
        • 其实它并没有在任何地方定义。
        【解决方案5】:

        根据@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
        

        【讨论】:

          【解决方案6】:

          这是一个简单的 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
          }
          

          【讨论】:

            【解决方案7】:

            这是相同的 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
            }
            

            【讨论】:

              【解决方案8】:

              检查非空白字符的范围比修剪整个字符串要快得多。

              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 子类中。

              【讨论】:

                【解决方案9】:

                必须将此代码用于 Swift 3:

                func isEmptyOrContainsOnlySpaces() -> Bool {
                
                    return self.trimmingCharacters(in: .whitespaces).characters.count == 0
                }
                

                【讨论】:

                  【解决方案10】:

                  我真的很惊讶我是第一个提出正则表达式的人

                  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
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-04-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-08-22
                    • 2013-11-09
                    相关资源
                    最近更新 更多