如何从字符串中删除所有前导空格?- Swift

218
我需要一种方法来移除字符串中的第一个字符,该字符是空格。我正在寻找一种方法,甚至是String类型的扩展,可以用于从字符串中删除一个字符。

8
你想要移除字符串中的第一个空格字符还是_所有_空格字符? - Alex
1
可能是重复的问题:从字符串中删除空格字符集,但保留空格 - Imanou Petit
32个回答

480

去除字符串首尾的空格:

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

Swift 3 / Swift 4:

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

215
这只适用于开头和结尾的空格。它不会删除字符串中包含的空格。 - sun
101
如果你想要移除所有空格,可以尝试使用我的String.stringByReplacingOccurrencesOfString(" ", withString: "")。 - Lucas
7
如果您想要去除换行符,您也可以使用NSCharacterSet.whitespaceAndNewlineCharacterSet() - Blip
2
为了使其与Swift 3.0兼容,并且删除字符串之间的空格,请使用以下答案:https://dev59.com/oV4b5IYBdhLWcg3w5VI9#39067610 - user4886069
3
Swift 3+用户:yourString.replacingOccurrences(of: " ", with: "") - Nadeesha Lakmal

169

如果你想要移除所有类型的空格(基于这个SO回答),正确的方式是:

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()
    }
}

编辑

这个回答是在问题是要删除所有空格时发布的,问题现已编辑为只提到前导空格。如果你只想删除前导空格,请使用以下方法:

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

6
也可以使用 .components(separatedBy: .whitespacesAndNewlines) 来将换行符分隔开。 - Derek
这应该是一个函数而不是一个变量。 - Jakub Truhlář
1
由于功能的逻辑,当您应该创建一个函数时,您正在创建一个“计算属性”。它正在执行某些操作而不是保存值或从另一个值计算它。请参阅:https://dev59.com/XGAg5IYBdhLWcg3wDHQ3 - Jakub Truhlář
4
@JakubTruhlář - 这是一种观点,而不是事实陈述。请参见https://softwareengineering.stackexchange.com/questions/304077/swift-functions-vs-computed-properties - Ashley Mills
1
@JakubTruhlář,你说“这应该是一个函数而不是变量”——这听起来非常像你在陈述事实,而不是你的观点。如果你阅读了链接问题的答案,你会发现虽然对你来说“有道理”,但对其他人来说并不一定如此。 - Ashley Mills
显示剩余4条评论

96

这个字符串扩展可以删除字符串中所有的空格,不仅仅是结尾处的空格...

 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.

4
仅适用于“ ”(不考虑其他类型的空格)。 - fpg1503
@fpg1503 还有哪些其他类型的空格? - Ricardo
在Zs类别中定义的:fileformat.info/info/unicode/category/Zs/list.htm - fpg1503

51

Swift 3

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

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

结果将是:

HelloWorld!

1
仅适用于“ ”(不考虑其他类型的空格)。 - fpg1503
@Greg,您仍然缺少16个其他字符:http://www.fileformat.info/info/unicode/category/Zs/list.htm - fpg1503

25

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: "")

str.trimmingCharacters(in: .whitespacesAndNewlines) 看起来是最简单的方法。谢谢。 - Rizwan Walayat

19

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

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

Swift 4:myString.replacingOccurrences(of: "\s", with: "", options: NSString.CompareOptions.regularExpression, range: nil) - norbDEV

16

如果您使用的是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() Apple官方文档

有时候,链接多个字符串方法可以非常方便地进行一次性转换,例如,如果您想要在一行中将短NSData blob转换为没有空格的十六进制字符串,则可以使用Swift内置的字符串插值和一些修剪和替换来完成此操作:

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

仅适用于“ ”(不考虑其他类型的空格)。 - fpg1503
它仍然没有考虑字符串中间的其他类型的空格。 - fpg1503

12

对于Swift 3.0

import Foundation

var str = " Hear me calling"

extension String {
    var stringByRemovingWhitespaces: String {
        return components(separatedBy: .whitespaces).joined()
    }
}

str.stringByRemovingWhitespaces  // Hearmecalling

9

Swift 4

使用正则表达式的优点:

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

// thisiswrongcontainedteeext

7
我会使用这个扩展程序,以达到灵活性并模拟其他集合的操作方式:
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"

仅适用于“ ”(不考虑其他类型的空格)。 - fpg1503

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接