从字符串中删除空格字符集(不包括空格)。

19

如何从字符串中删除空白字符集但保留单词之间的单个空格。我想要删除双空格、三空格等等…

6个回答

51

Swift 3

extension String {
    func condensingWhitespace() -> String {
        return self.components(separatedBy: .whitespacesAndNewlines)
            .filter { !$0.isEmpty }
            .joined(separator: " ")
    }
}

let string = "  Lorem   \r  ipsum dolar   sit  amet. "
print(string.condensingWhitespace())
// Lorem ipsum dolar sit amet.

Swift 旧版

NSCharacterSet 可以轻松实现此功能:

func condenseWhitespace(string: String) -> String {
    let components = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!isEmpty($0)})
    return join(" ", components)
}

var string = "  Lorem   \r  ipsum dolar   sit  amet. "
println(condenseWhitespace(string))
// Lorem ipsum dolar sit amet.

或者如果你想将它作为String的扩展:

extension String {
    func condenseWhitespace() -> String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
        return " ".join(components)
    }
}

var string = "  Lorem   \r  ipsum dolar   sit  amet. "
println(string.condenseWhitespace())
// Lorem ipsum dolar sit amet.

所有的功劳归功于NSHipster关于NSCharacterSet的文章


String扩展的代码在Swift 2中无法工作! - headkit
1
对于Swift 3,您应该使用.filter({!$0.isEmpty})。 - Sergey Nikitin
1
你的 Swift 3 代码中存在不匹配的 condenseWhitespace/condensingWhitespace。可以将 CharacterSet.whitespacesAndNewlines 缩短为 .whitespacesAndNewlines - Martin R

11

兼容Swift 2的代码:

extension String {
    var removeExcessiveSpaces: String {
        let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        let filtered = components.filter({!$0.isEmpty})
        return filtered.joinWithSeparator(" ")
    }
}

使用方法:

let str = "test  spaces    too many"
print(str.removeExcessiveSpaces)
// Output: test spaces too many

4

如果你具有 Objective-C/Foundation 背景,使用 Swift 修剪字符串中的多余空格字符可能很明显,可以使用 componentsSeparatedByCharactersInSet(:) 函数。

操作步骤如下:从字符串中获取一个 String 数组,其中所有空格字符都被替换为空字符串,将此数组过滤为一个新的 String 数组,其中所有空字符串都已被移除,并通过空格字符将此数组中的所有字符串连接到一个新的字符串中。

以下 Playground 代码展示了如何使用这种方法:

import Foundation

let string = "  Lorem   ipsum dolar   sit  amet. "

let newString = string
.componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
.filter { !$0.isEmpty }
.joinWithSeparator(" ") 

print(newString) // prints "Lorem ipsum dolar sit amet."

如果您需要重复执行此操作,可以将您的代码重构为一个 String 扩展函数:
import Foundation

extension String {
    func condenseWhitespace() -> String {
        return componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
            .filter { !$0.isEmpty }
            .joinWithSeparator(" ")
    }
}

let string = "  Lorem   ipsum dolar   sit  amet. "
let newString = string.condenseWhitespace()

print(newString) // prints "Lorem ipsum dolar sit amet."

然而,使用Swift,还有一种真正实用且不需要导入Foundation的方法。

这里的步骤是从您的字符串中获取一个String.CharacterView数组,其中所有空格字符都已被删除,将此String.CharacterView数组映射到String数组,并将此数组的所有字符串连接成一个新字符串,同时用空格字符分隔它们。

以下Playground代码展示了如何以这种方式进行操作:

let string = "  Lorem   ipsum dolar   sit  amet. "

let newString = string.characters
    .split { $0 == " " }
    .map { String($0) }
    .joinWithSeparator(" ")

print(newString) // prints "Lorem ipsum dolar sit amet."

如果您需要重复执行此操作,可以将代码重构为一个 String 扩展函数:
extension String {
    func condenseWhitespace() -> String {
        return characters
            .split { $0 == " " }
            .map { String($0) }
            .joinWithSeparator(" ")
    }
}

let string = "  Lorem   ipsum dolar   sit  amet. "
let newString = string.condenseWhitespace()

print(newString) // prints "Lorem ipsum dolar sit amet."

1
这会去除空格,但不会去除制表符、换行符或任何其他可能被定义为空白字符的内容(尽管我很想看到一种非基础解决方案来确定 Swift 字符是否为空白字符)。 - bshirley

0

另一种选择是使用正则表达式搜索,将一个或多个空格字符的所有出现替换为单个空格。 示例(Swift 3):

let string = "  Lorem   \r  ipsum dolar   sit  amet. "

let condensed = string
        .replacingOccurrences(of: "\\s+", with: " ", options: .regularExpression)
        .trimmingCharacters(in: .whitespacesAndNewlines)

print(condensed.debugDescription) // "Lorem ipsum dolar sit amet."

0

对于 Swift 3.1

extension String {
    var trim : String {
        get {
            return characters
                .split { $0 == " " || $0 == "\r" }
                .map { String($0) }
                .joined(separator: " ")
        }
    }
}

let string = "  Lorem   \r  ipsum dolar   sit  amet. "
print(string.trim)

将输出:

Lorem ipsum dolar sit amet.

-1
你可以使用我写的 Swift 字符串扩展中的 trim() 方法 https://bit.ly/JString
var string = "hello  "
var trimmed = string.trim()
println(trimmed)// "hello"

我查看了你的源代码,但我认为这并不是OP所要求的(即删除双倍和三倍空格,并用单个空格替换它们)。如果我错了,请告诉我,我会撤销投票。 - Suragch
这将删除 n 个空格并用没有空格替换它们。这正是Python的trim方法所做的。要删除大于1的空格,请使用正则表达式。 - William Falcon
1
但是如果您的字符串中间有多个空格怎么办?例如,"hello________there"(使用下划线表示空格) - Suragch
OP只要求删除字符串开头的空格,所以这个答案是不正确的。 - Macistador
适用于前端的工作。但是一年后评论某些东西也很酷。 - William Falcon

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