【问题标题】:Trim spaces from end of a NSString从 NSString 的末尾修剪空格
【发布时间】:2011-08-11 00:08:33
【问题描述】:

我需要删除字符串末尾的空格。我怎样才能做到这一点? 示例:如果字符串为"Hello ",则它必须变为"Hello"

【问题讨论】:

标签: nsstring whitespace trim


【解决方案1】:

取自这里的答案:https://stackoverflow.com/a/5691567/251012

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
    NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]
                                                               options:NSBackwardsSearch];
    if (rangeOfLastWantedCharacter.location == NSNotFound) {
        return @"";
    }
    return [self substringToIndex:rangeOfLastWantedCharacter.location+1]; // non-inclusive
}

【讨论】:

  • 要在字符集中包含换行符,请使用whitespaceAndNewlineCharacterSet
  • 请注意:此方法会删除两端的空格。它不会从字符串内部删除空格。
  • 我不明白为什么不回答这个问题会得到这么多的赞成票。您的解决方案也删除了字符串开头的空格,这不是所要求的。
  • @JamesBoutcher 之所以获得如此多的赞成票是因为我们在谷歌中寻找“trim NSString”,这是该问题的正确答案。确实,OP要求别的东西。
【解决方案2】:

另一种解决方案涉及创建可变字符串:

//make mutable string
NSMutableString *stringToTrim = [@" i needz trim " mutableCopy];

//pass it by reference to CFStringTrimSpace
CFStringTrimWhiteSpace((__bridge CFMutableStringRef) stringToTrim);

//stringToTrim is now "i needz trim"

【讨论】:

    【解决方案3】:

    给你...

    - (NSString *)removeEndSpaceFrom:(NSString *)strtoremove{
        NSUInteger location = 0;
        unichar charBuffer[[strtoremove length]];
        [strtoremove getCharacters:charBuffer];
        int i = 0;
        for(i = [strtoremove length]; i >0; i--) {
            NSCharacterSet* charSet = [NSCharacterSet whitespaceCharacterSet];
            if(![charSet characterIsMember:charBuffer[i - 1]]) {
                break;
            }
        }
        return [strtoremove substringWithRange:NSMakeRange(location, i  - location)];
    }
    

    所以现在就调用它。假设你有一个字符串,前面有空格,后面有空格,而你只想删除末尾的空格,你可以这样称呼它:

    NSString *oneTwoThree = @"  TestString   ";
    NSString *resultString;
    resultString = [self removeEndSpaceFrom:oneTwoThree];
    

    resultString 的末尾将没有空格。

    【讨论】:

      【解决方案4】:
      NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                    [NSCharacterSet whitespaceAndNewlineCharacterSet]];
      //for remove whitespace and new line character
      
      NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                    [NSCharacterSet punctuationCharacterSet]]; 
      //for remove characters in punctuation category
      

      还有很多其他的字符集。根据您的要求自行检查。

      【讨论】:

      • 这不是要修剪所有空格和换行符吗?问题是如何从末端修剪。
      • @giorgos-ath - 是的,它从末尾删除了空格
      • 问题是关于从最后删除。这个答案从头到尾都删除了。因此,这不是一个有效的答案。
      【解决方案5】:

      在 Swift 中仅从字符串的开头和结尾删除空格:

      斯威夫特 3

      string.trimmingCharacters(in: .whitespacesAndNewlines)
      

      以前的 Swift 版本

      string.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))
      

      【讨论】:

      • 这不是要修剪所有空格和换行符吗?问题是如何从末端修剪。
      • @GiorgosAth 不,这只会修剪字符串开头或结尾的字符。来自stringByTrimmigCharactersInSet: 的苹果文档 - “返回一个新字符串,该字符串是通过从给定字符集中包含的接收器字符的两端删除而生成的。” developer.apple.com/reference/foundation/nsstring/…
      • @GiorgosAth 这也与 Swift 中接受的答案完全相同。
      • 问题是关于从最后删除。这个答案从头到尾都删除了。因此,这不是一个有效的答案。
      【解决方案6】:

      Swift 版本

      只修剪字符串末尾的空格:

      private func removingSpacesAtTheEndOfAString(var str: String) -> String {
          var i: Int = countElements(str) - 1, j: Int = i
      
          while(i >= 0 && str[advance(str.startIndex, i)] == " ") {
              --i
          }
      
          return str.substringWithRange(Range<String.Index>(start: str.startIndex, end: advance(str.endIndex, -(j - i))))
      }
      

      修剪字符串两边的空格:

      var str: String = " Yolo "
      var trimmedStr: String = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
      

      【讨论】:

      • 问题是关于最后修剪空格。您的代码修剪两边。
      • 此代码无法编译。方法 countElements() 和 Advance() 没有定义。
      【解决方案7】:

      这将仅删除您选择的尾随字符。

      func trimRight(theString: String, charSet: NSCharacterSet) -> String {
      
          var newString = theString
      
          while String(newString.characters.last).rangeOfCharacterFromSet(charSet) != nil {
              newString = String(newString.characters.dropLast())
          }
      
          return newString
      }
      

      【讨论】:

        【解决方案8】:

        在 Swift 中

        从字符串的两侧修剪空格和换行符:

        var url: String = "\n   http://example.com/xyz.mp4   "
        var trimmedUrl: String = url.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
        

        【讨论】:

          【解决方案9】:

          Objective-C 中只修剪一端而不是两端的简单解决方案:

          @implementation NSString (category)
          
          /// trims the characters at the end
          - (NSString *)stringByTrimmingSuffixCharactersInSet:(NSCharacterSet *)characterSet {
              NSUInteger i = self.length;
              while (i > 0 && [characterSet characterIsMember:[self characterAtIndex:i - 1]]) {
                  i--;
              }
              return [self substringToIndex:i];
          }
          
          @end
          

          还有一个对称实用程序,仅用于修剪开头:

          @implementation NSString (category)
          
          /// trims the characters at the beginning
          - (NSString *)stringByTrimmingPrefixCharactersInSet:(NSCharacterSet *)characterSet {
              NSUInteger i = 0;
              while (i < self.length && [characterSet characterIsMember:[self characterAtIndex:i]]) {
                  i++;
              }
              return [self substringFromIndex:i];
          }
          
          @end
          

          【讨论】:

            【解决方案10】:

            要修剪所有尾随空白字符(我猜这实际上是您的意图),以下是一种非常简洁明了的方法。

            斯威夫特 5:

            let trimmedString = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression)
            

            目标-C:

            NSString *trimmedString = [string stringByReplacingOccurrencesOfString:@"\\s+$" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length)];
            

            一行,带有一点正则表达式。

            【讨论】:

              【解决方案11】:

              这里描述了解决方案:How to remove whitespace from right end of NSString?

              将以下类别添加到 NSString:

              - (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
                  NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]
                                                                             options:NSBackwardsSearch];
                  if (rangeOfLastWantedCharacter.location == NSNotFound) {
                      return @"";
                  }
                  return [self substringToIndex:rangeOfLastWantedCharacter.location+1]; // non-inclusive
              }
              
              - (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters {
                  return [self stringByTrimmingTrailingCharactersInSet:
                          [NSCharacterSet whitespaceAndNewlineCharacterSet]];
              }
              

              你就这样使用它:

              [yourNSString stringByTrimmingTrailingWhitespaceAndNewlineCharacters]
              

              【讨论】:

                【解决方案12】:

                我想出了这个函数,它的行为基本上与 Alex 的回答中的一个相似:

                -(NSString*)trimLastSpace:(NSString*)str{
                    int i = str.length - 1;
                    for (; i >= 0 && [str characterAtIndex:i] == ' '; i--);
                    return [str substringToIndex:i + 1];
                }
                

                whitespaceCharacterSet 除了空格本身还包括制表符,在我的情况下无法出现。所以我想一个简单的比较就足够了。

                【讨论】:

                  【解决方案13】:

                  let string = "测试修剪后的字符串"

                  要删除空格和换行,请使用以下代码:-

                  让 str_trimmed = yourString.trimmingCharacters(in: .whitespacesAndNewlines)

                  仅从字符串中删除空格,请使用以下代码:-

                  让 str_trimmed = yourString.trimmingCharacters(in: .whitespaces)

                  【讨论】:

                    【解决方案14】:
                    NSString* NSStringWithoutSpace(NSString* string)
                    {
                        return [string stringByReplacingOccurrencesOfString:@" " withString:@""];
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2021-09-16
                      • 1970-01-01
                      • 2012-03-14
                      • 1970-01-01
                      • 2013-09-11
                      • 1970-01-01
                      • 2017-05-24
                      • 2014-11-08
                      • 1970-01-01
                      相关资源
                      最近更新 更多