103

数値であるはずの未知のデータを解析する必要がありますが、空白やその他の英数字以外の文字が含まれている可能性があります。

Swift でこれを行う新しい方法はありますか? 私がオンラインで見つけることができるのは、古いCのやり方のようです。

私は見ていますstringByTrimmingCharactersInSet-私の入力には、文字列の先頭または末尾に空白/特殊文字のみが含まれていると確信しているためです。これに使用できる組み込みの文字セットはありますか? それとも、自分で作成する必要がありますか?

stringFromCharactersInSet()保持する有効な文字のみを指定できるようなものがあることを望んでいました

4

17 に答える 17

218

保持する有効な文字のみを指定できる stringFromCharactersInSet() のようなものがあることを望んでいました。

文字セットとともに使用trimmingCharactersして、inverted文字列の先頭または末尾から文字を削除できます。Swift 3 以降では:

let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)

または、文字列の任意の場所 (開始または終了だけでなく) の数値以外の文字を削除する場合filtercharacters、たとえば Swift 4.2.1 で次のようにします。

let result = string.filter("0123456789.".contains)

または、文字列内の任意の場所から CharacterSet から文字を削除する場合は、次を使用します。

let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))

または、特定の形式 (例: ) の有効な文字列のみを一致させたい場合は、####.##正規表現を使用できます。例えば:

if let range = string.range(of: #"\d+(\.\d*)?"#, options: .regularExpression) {
    let result = string[range] // or `String(string[range])` if you need `String`
}

これらの異なるアプローチの動作はわずかに異なるため、何をしようとしているのかによって異なります。小数または整数のみが必要な場合は、小数点を含めるか除外します。これを実現する方法はたくさんあります。


古い Swift 2 構文については、この回答の以前のリビジョンを参照してください。

于 2016-04-13T19:20:38.610 に答える
46
let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

スイフト3

let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)

この回答に賛成できます。

于 2016-05-12T16:30:40.607 に答える
32

私は拡張機能が好きで、少しすっきりしているように見えるので、このソリューションを好みます。ここに再現されたソリューション:

extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}
于 2017-05-24T06:41:15.697 に答える
8

スイフト4

ただし、同様に読み取れない拡張機能またはコンポーネントSeparatedByCharactersInSetがないと。

let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
于 2018-05-17T15:57:46.700 に答える