web-dev-qa-db-ja.com

Swift 2で文字列内の複数のスペースを削除する方法

Swift 2まで)この拡張機能を使用して、複数の空白を削除しました。

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

しかし、Swift 2の場合、エラーが発生します

タイプ '(String)'の引数リストで 'isEmpty'を呼び出すことはできません

Swift 2で複数のスペースを削除するにはどうすればよいですか?Thnx!

17
headkit

Swift 2では、joinjoinWithSeparatorになり、配列で呼び出します。

filterでは、現在の反復アイテム$0isEmptyを呼び出す必要があります。

質問のように、空白と改行文字を一意のスペース文字に置き換えるには:

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

let result = "Hello  World.\nHello!".condenseWhitespace()  // "Hello World. Hello!"

関数はパラメータを受け取らないため、代わりにプロパティにすることができます。

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

let result = "Hello  World.\nHello!".condensedWhitespace  // "Hello World. Hello!"

Swiftではさらに多くの変更があります。

関数:

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

let result = "Hello  World.\nHello!".condenseWhitespace()

プロパティ:

extension String {
    var condensedWhitespace: String {
        let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
        return components.filter { !$0.isEmpty }.joined(separator: " ")
    }
}

let result = "Hello  World.\nHello!".condensedWhitespace

Swift 4.2でNSCharacterSetはCharacterSetになり、ドット構文を省略して使用できます。

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

let result = "Hello  World.\nHello!".condenseWhitespace()  // "Hello World. Hello!"
42
Eric Aya

分割文字列から配列へ、次に結合再びメモリ効率が悪い。その多くのメモリを取ります。この場合の最良の方法は、指定された文字列をスキャンして、その文字列に対して操作を実行することです。 正規表現はテキストをスキャンするための高度な方法です。上記の結論について、解決策を以下に示します。

Swift 4.x

extension String {

    func removeExtraSpaces() -> String {
        return self.replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
    }

}

使用法

let startingString = "hello   world! \n\n I am   here!"
let processedString = startingString.removeExtraSpaces()
print(processedString)

出力:

processedString => "hello world!I am here!"

独自の要件に応じてさらに多くのことを実行できますが、ここで指摘しているのは、大量のメモリを消費する配列を作成するのではなく、文字列で正規表現を使用することです。

12
Gurjit Singh

Swift 3:クリーナーバージョン

extension String {
    var condensedWhitespace: String {
        let components = self.components(separatedBy: .whitespacesAndNewlines)
        return components.filter { !$0.isEmpty }.joined(separator: " ")
    }
}
8
Maksim Kniazev

これが私のものです:それが実際にどのように機能したか。

extension String {

    func removeExtraSpaces() -> String {
        var data  = ""
        var numberOfSpace = 0
        let items = self.getComponents(separatedBy: " ")
        for item in items{
            if item == " "{
                numberOfSpace = numberOfSpace + 1
            }else{
                numberOfSpace = 0
            }
            if numberOfSpace == 1 || numberOfSpace == 0 {
                data =  data + item
                //data.append(item)
            }
        }
        return data
    }
} 

使用法

 var message = "What  is the    purpose   of life?"
 message = message.removeExtraSpaces()
 print(message)

出力:

人生の目的は何ですか?

1
Nazmul Hasan

最もクリーンなバージョン。文書化され、メモリ効率が高く、非常に使いやすい。

extension String {

    /// Returns a condensed string, with no extra whitespaces and no new lines.
    var condensed: String {
        return replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
    }

    /// Returns a condensed string, with no whitespaces at all and no new lines.
    var extraCondensed: String {
        return replacingOccurrences(of: "[\\s\n]+", with: "", options: .regularExpression, range: nil)
    }

}

使用法:

let a = " Hello\n  I am  a string  ".condensed
let b = " Hello\n  I am  a string  ".extraCondensed

出力:

a:「こんにちは私はひもです」

b:「HelloIamastring」

0
Lucio Botteri
var str = "Hello  World.\nHello!"

if let regex = try? NSRegularExpression(pattern: "\\s+", options:NSRegularExpression.Options.caseInsensitive)
{
    str = regex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.count), withTemplate: " ")

}
0
Manikandan