【问题标题】:How should I remove all the leading spaces from a string? - swift我应该如何从字符串中删除所有前导空格? - 迅速
【发布时间】:2015-04-18 16:59:30
【问题描述】:

我需要一种方法来从作为空格的字符串中删除第一个字符。我正在寻找一种方法,甚至是 String 类型的扩展,我可以使用它来剪切字符串中的一个字符。

【问题讨论】:

标签: string swift


【解决方案1】:

删除前导和尾随空格:

let trimmedString = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

斯威夫特 3 / 斯威夫特 4:

let trimmedString = string.trimmingCharacters(in: .whitespaces)

【讨论】:

  • 这仅适用于前导和尾随空格。这不会删除字符串中包含的空格。
  • 如果你想删除所有空格,你可以试试 myString.stringByReplacingOccurrencesOfString(" ", withString: "")
  • 如果您还想修剪换行符,也可以使用NSCharacterSet.whitespaceAndNewlineCharacterSet()
  • 要使其适用于 Swift 3.0 并删除字符串之间的空格,请使用答案:stackoverflow.com/a/39067610/4886069
  • Swift 3+ 用户:yourString.replacingOccurrences(of: " ", with: "")
【解决方案2】:

当你想删除各种空格时的正确方法(基于this SO answer)是:

extension String {
    var stringByRemovingWhitespaces: String {
        let components = componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
        return components.joinWithSeparator("")
    }
}

Swift 3.0+ (3.0, 3.1, 3.2, 4.0)

extension String {
    func removingWhitespaces() -> String {
        return components(separatedBy: .whitespaces).joined()
    }
}

编辑

当问题是关于删除 all 空格时发布此答案,该问题被编辑为仅提及前导空格。如果您只想删除前导空格,请使用以下命令:

extension String {
    func removingLeadingSpaces() -> String {
        guard let index = firstIndex(where: { !CharacterSet(charactersIn: String($0)).isSubset(of: .whitespaces) }) else {
            return self
        }
        return String(self[index...])
    }
}

【讨论】:

  • 还有 .components(separatedBy: .whitespacesAndNewlines) 也用于换行
  • 这应该是一个函数而不是一个变量
  • 因为特性的逻辑。当你应该创建一个函数时,你正在创建一个计算属性。它正在做 smt 而不是持有一个值或从另一个值计算它。看:stackoverflow.com/questions/24035276/…
  • @JakubTruhlář - 这是一个意见问题,不是事实陈述。见softwareengineering.stackexchange.com/questions/304077/…
  • @JakubTruhlář 你说“这应该是一个函数而不是一个变量” - 这听起来很像你在陈述一个事实,而不是你的观点。如果您阅读链接问题的答案,您会发现虽然它对您“有意义”,但对其他人……不一定。
【解决方案3】:

此字符串扩展从字符串中删除所有空格,而不仅仅是尾随空格...

 extension String {
    func replace(string:String, replacement:String) -> String {
        return self.replacingOccurrences(of: string, with: replacement, options: NSString.CompareOptions.literal, range: nil)
    }

    func removeWhitespace() -> String {
        return self.replace(string: " ", replacement: "")
    }
  }

例子:

let string = "The quick brown dog jumps over the foxy lady."
let result = string.removeWhitespace() // Thequickbrowndogjumpsoverthefoxylady.

【讨论】:

  • 仅适用于“”(不考虑其他类型的whitesapce)
  • @fpg1503 还有哪些其他类型的空格?
  • Zs分类中定义的那些:fileformat.info/info/unicode/category/Zs/list.htm
【解决方案4】:

斯威夫特 3

您可以简单地使用此方法删除字符串中的所有正常空格(不考虑所有类型的空格):

let myString = " Hello World ! "
let formattedString = myString.replacingOccurrences(of: " ", with: "")

结果将是:

HelloWorld!

【讨论】:

【解决方案5】:

你也可以使用正则表达式。

let trimmedString = myString.stringByReplacingOccurrencesOfString("\\s", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)

【讨论】:

  • Swift 4: myString.replacingOccurrences(of: "\\s", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
【解决方案6】:

对于 Swift 3.0+,请参阅其他答案。现在这是 Swift 2.x 的旧版答案

如上所述,由于您对删除第一个字符感兴趣,因此 .stringByTrimmingCharactersInSet() 实例方法会很好地工作:

myString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

您还可以创建自己的字符集来修剪字符串的边界,例如:

myString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))

还有一个内置的实例方法来处理删除或替换子字符串,称为 stringByReplacingOccurrencesOfString(target: String, replacement: String)。它可以删除字符串中任何地方出现的空格或任何其他模式

您可以指定选项和范围,但不需要:

myString.stringByReplacingOccurrencesOfString(" ", withString: "")

这是删除或替换字符串中任何重复字符模式的简单方法,并且可以链接,尽管每次通过它都必须再次通过整个字符串,从而降低效率。所以你可以这样做:

 myString.stringByReplacingOccurrencesOfString(" ", withString: "").stringByReplacingOccurrencesOfString(",", withString: "")

...但需要两倍的时间。

.stringByReplacingOccurrencesOfString() documentation from Apple site

链接这些 String 实例方法有时对于一次性转换非常方便,例如,如果您想将一个短的 NSData blob 转换为一行中没有空格的十六进制字符串,您可以使用 Swift 内置的字符串插值和一些修剪和替换:

("\(myNSDataBlob)").stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "")

【讨论】:

  • 仅适用于“”(不考虑其他类型的whitesapce)
  • 它仍然不考虑字符串中间的其他类型的空白
【解决方案7】:

Swift 4、4.2 和 5

仅从前面和结尾删除空格

let str = "  Akbar Code  "
let trimmedString = str.trimmingCharacters(in: .whitespacesAndNewlines)

从字符串中的每个位置删除空格

let stringWithSpaces = " The Akbar khan code "
let stringWithoutSpaces = stringWithSpaces.replacingOccurrences(of: " ", with: "")

【讨论】:

    【解决方案8】:

    对于 swift 3.0

    import Foundation
    
    var str = " Hear me calling"
    
    extension String {
        var stringByRemovingWhitespaces: String {
            return components(separatedBy: .whitespaces).joined()
        }
    }
    
    str.stringByRemovingWhitespaces  // Hearmecalling
    

    【讨论】:

      【解决方案9】:

      斯威夫特 4

      使用正则表达式的绝佳案例:

      " this is    wrong contained teee xt     "
          .replacingOccurrences(of: "^\\s+|\\s+|\\s+$", 
                                with: "", 
                                options: .regularExpression)
      
      // thisiswrongcontainedteeext
      

      【讨论】:

        【解决方案10】:

        如果您想从前面(和后面)而不是中间删除空格,您应该使用stringByTrimmingCharactersInSet

            let dirtyString   = " First Word "
            let cleanString = dirtyString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        

        如果您想从字符串中的任何位置删除空格,那么您可能需要查看 stringByReplacing...

        【讨论】:

        • 中间的空格怎么去掉?
        • @NikhilGupta 不,只有前导和尾随(示例" First Word " 输出"First Word")。
        【解决方案11】:

        我会使用这个扩展,以灵活并模仿其他集合的做法:

        extension String {
            func filter(pred: Character -> Bool) -> String {
                var res = String()
                for c in self.characters {
                    if pred(c) {
                        res.append(c)
                    }
                }
                return res
            }
        }
        
        "this is a String".filter { $0 != Character(" ") } // "thisisaString"
        

        【讨论】:

        • 仅适用于“”(不考虑其他类型的whitesapce)
        【解决方案12】:

        尝试函数式编程来去除空格:

        extension String {
          func whiteSpacesRemoved() -> String {
            return self.filter { $0 != Character(" ") }
          }
        }
        

        【讨论】:

          【解决方案13】:

          您好,这可能会晚,但值得一试。这是来自游乐场文件。您可以将其设为字符串扩展。

          这是用 Swift 5.3 编写的

          方法一:

          var str = "\n \tHello, playground       "
          if let regexp = try? NSRegularExpression(pattern: "^\\s+", options: NSRegularExpression.Options.caseInsensitive) {
              let mstr = NSMutableString(string: str)
              regexp.replaceMatches(in: mstr, options: [], range: NSRange(location: 0, length: str.count), withTemplate: "")
              str = mstr as String
          }
          
          Result: "Hello, playground       "
          

          方法二:

          if let c = (str.first { !($0 == " " || $0 == "\t" || $0 == "\n") }) {
              if let nonWhiteSpaceIndex = str.firstIndex(of: c) {
                  str.replaceSubrange(str.startIndex ..< nonWhiteSpaceIndex, with: "")
              }
          }
          
          Result: "Hello, playground       "
          

          【讨论】:

          • 这适用于 Swift 5.x
          • 这太棒了!谢谢
          【解决方案14】:

          代码少做多。

          "Hello World".filter({$0 != " "}) // HelloWorld
          

          【讨论】:

            【解决方案15】:

            你也可以试试这个

               let updatedString = searchedText?.stringByReplacingOccurrencesOfString(" ", withString: "-")
            

            【讨论】:

            • 仅适用于“”(不考虑其他类型的whitesapce)
            【解决方案16】:
            extension String {
            
                var removingWhitespaceAndNewLines: String {
                    return removing(.whitespacesAndNewlines)
                }
            
                func removing(_ forbiddenCharacters: CharacterSet) -> String {
                    return String(unicodeScalars.filter({ !forbiddenCharacters.contains($0) }))
                }
            }
            

            【讨论】:

              【解决方案17】:

              如果有人从字符串中删除多余的空格,例如 = "This is the demo text remove extra space between the words."

              你可以在 Swift 4 中使用这个函数。

              func removeSpace(_ string: String) -> String{
                  var str: String = String(string[string.startIndex])
                  for (index,value) in string.enumerated(){
                      if index > 0{
                          let indexBefore = string.index(before: String.Index.init(encodedOffset: index))
                          if value == " " && string[indexBefore] == " "{
                          }else{
                              str.append(value)
                          }
                      }
                  }
                  return str
              }
              

              结果将是

              "This is the demo text remove extra space between the words."
              

              【讨论】:

                【解决方案18】:

                Swift 3 版本

                  //This function trim only white space:
                   func trim() -> String
                        {
                            return self.trimmingCharacters(in: CharacterSet.whitespaces)
                        }
                    //This function trim whitespeaces and new line that you enter:
                     func trimWhiteSpaceAndNewLine() -> String
                        {
                            return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
                        }
                

                【讨论】:

                  【解决方案19】:

                  在 Swift 4 中修剪空白

                  let strFirstName = txtFirstName.text?.trimmingCharacters(in: 
                   CharacterSet.whitespaces)
                  

                  【讨论】:

                    【解决方案20】:

                    另一个答案,有时输入字符串可以在单词之间包含多个空格。如果您需要标准化为单词之间只有 1 个空格,请试试这个 (Swift 4/5)

                    let inputString = "  a very     strange   text !    "
                    let validInput = inputString.components(separatedBy:.whitespacesAndNewlines).filter { $0.count > 0 }.joined(separator: " ")
                    
                    print(validInput) // "a very strange text !"
                    

                    【讨论】:

                      【解决方案21】:

                      对我来说,以下行用于删除空格。

                      let result = String(yourString.filter {![" ", "\t", "\n"].contains($0)})
                      

                      【讨论】:

                        【解决方案22】:
                        string = string.filter ({!" ".contains($0) })
                        

                        【讨论】:

                          【解决方案23】:

                          对于寻找答案以从字符串中删除仅前导空格的人(正如问题标题明确提出的那样),这是一个答案:

                          假设:

                          let string = "   Hello, World!   "
                          

                          要删除所有前导空格,请使用以下代码:

                          var filtered = ""
                          var isLeading = true
                          for character in string {
                              if character.isWhitespace && isLeading {
                                  continue
                              } else {
                                  isLeading = false
                                  filtered.append(character)
                              }
                          }
                          print(filtered) // "Hello, World!   "
                          

                          我确信有比这更好的代码,但它对我有用。

                          【讨论】:

                            【解决方案24】:

                            斯威夫特 5+ 从字符串的前缀(开始)中删除所有空格,您可以将类似的用于字符串的后缀/结尾

                             extension String {
                                func deletingPrefix(_ prefix: String) -> String {
                                  guard self.hasPrefix(prefix) else { return self }
                                  return String(self.dropFirst(prefix.count))
                                }
                                
                                func removeWhitespacePrefix() -> String {
                                 let prefixString = self.prefix(while: { char in
                                    return char == " "
                                  })
                                  return self.deletingPrefix(String(prefixString))
                                }
                              }
                            

                            【讨论】:

                              【解决方案25】:

                              真正快速的解决方案:

                              用法:

                              let txt = "        hello world     "
                              let txt1 = txt.trimStart() // "hello world     "
                              let txt2 = txt.trimEnd()   // "        hello world"
                              
                              

                              用法2:

                              let txt = "rr rrr rrhello world r r r r r r"
                              let txt1 = txt.trimStart(["r", " "]) // "hello world r r r r r r"
                              let txt2 = txt.trimEnd(["r", " "])   // "rr rrr rrhello world"
                              
                              

                              如果您需要从字符串中删除所有空格:

                              txt.replace(of: " ", to: "")
                              
                              public extension String {
                                  func trimStart(_ char: Character) -> String {
                                      return trimStart([char])
                                  }
                                  
                                  func trimStart(_ symbols: [Character] = [" ", "\t", "\r", "\n"]) -> String {
                                      var startIndex = 0
                                      
                                      for char in self {
                                          if symbols.contains(char) {
                                              startIndex += 1
                                          }
                                          else {
                                              break
                                          }
                                      }
                                      
                                      if startIndex == 0 {
                                          return self
                                      }
                                      
                                      return String( self.substring(from: startIndex) )
                                  }
                                  
                                  func trimEnd(_ char: Character) -> String {
                                      return trimEnd([char])
                                  }
                                  
                                  func trimEnd(_ symbols: [Character] = [" ", "\t", "\r", "\n"]) -> String {
                                      var endIndex = self.count - 1
                                      
                                      for i in (0...endIndex).reversed() {
                                          if symbols.contains( self[i] ) {
                                              endIndex -= 1
                                          }
                                          else {
                                              break
                                          }
                                      }
                                      
                                      if endIndex == self.count {
                                          return self
                                      }
                                      
                                      return String( self.substring(to: endIndex + 1) )
                                  }
                              }
                              
                              /////////////////////////
                              /// ACCESS TO CHAR BY INDEX
                              ////////////////////////
                              extension StringProtocol {
                                  subscript(offset: Int) -> Character { self[index(startIndex, offsetBy: offset)] }
                                  subscript(range: Range<Int>) -> SubSequence {
                                      let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
                                      return self[startIndex..<index(startIndex, offsetBy: range.count)]
                                  }
                                  subscript(range: ClosedRange<Int>) -> SubSequence {
                                      let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
                                      return self[startIndex..<index(startIndex, offsetBy: range.count)]
                                  }
                                  subscript(range: PartialRangeFrom<Int>) -> SubSequence { self[index(startIndex, offsetBy: range.lowerBound)...] }
                                  subscript(range: PartialRangeThrough<Int>) -> SubSequence { self[...index(startIndex, offsetBy: range.upperBound)] }
                                  subscript(range: PartialRangeUpTo<Int>) -> SubSequence { self[..<index(startIndex, offsetBy: range.upperBound)] }
                              }
                              
                              

                              【讨论】:

                                【解决方案26】:

                                Swift 3 版 BadmintonCat 的回答

                                extension String {
                                    func replace(_ string:String, replacement:String) -> String {
                                        return self.replacingOccurrences(of: string, with: replacement, options: NSString.CompareOptions.literal, range: nil)
                                    }
                                
                                    func removeWhitespace() -> String {
                                        return self.replace(" ", replacement: "")
                                    }
                                }
                                

                                【讨论】:

                                • 仅适用于“”(不考虑其他类型的whitesapce)
                                • 因为你的答案是错误的。您提供更新的答案也是错误的。有多种空格,这就是为什么使用 whitespaceCharacterSet 是最佳做法的原因。
                                【解决方案27】:

                                删除字符串中的所有空格:

                                let space_removed_string = (yourstring?.components(separatedBy: " ").joined(separator: ""))!
                                

                                【讨论】:

                                  【解决方案28】:
                                  class SpaceRemover
                                  {
                                      func SpaceRemover(str :String)->String
                                      {
                                          var array = Array(str)
                                          var i = array.count
                                          while(array.last == " ")
                                          {
                                              var array1 = [Character]()
                                              for item in  0...i - 1
                                              {
                                                  array1.append(array[item])
                                              }
                                              i = i - 1
                                              array = array1
                                              print(array1)
                                              print(array)
                                  
                                          }
                                  
                                          var arraySecond = array
                                          var j = arraySecond.count
                                  
                                          while(arraySecond.first == " ")
                                          {
                                              var array2 = [Character]()
                                              if j > 1
                                              {
                                                  for item in 1..<j
                                                  {
                                                      array2.append(arraySecond[item])
                                                  }
                                              }
                                              j = j - 1
                                              arraySecond = array2
                                              print(array2)
                                              print(arraySecond)
                                  
                                          }
                                          print(arraySecond)
                                          return String(arraySecond)
                                      }
                                  }
                                  

                                  【讨论】:

                                  • 为什么需要这个复杂的代码来删除空格?
                                  猜你喜欢
                                  • 1970-01-01
                                  • 2011-07-25
                                  • 1970-01-01
                                  • 2011-08-24
                                  • 2023-04-08
                                  • 2019-11-25
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多