从String中提取数字并将其保存到数组中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从String中提取数字并将其保存到数组中相关的知识,希望对你有一定的参考价值。

你好,我的朋友,我需要你的帮助! :)我是斯威夫特的绝对初学者,完全不知道我在做什么。

我需要从我转换成字符串的txt文件中提取所有数字。我想将所有数字保存到一个新的数组中,我还必须使用CharacterView来解决问题。

这是我到目前为止所得到的。从txt文件中读取没有问题。

func readFile(){
    let path = Bundle.main.path(forResource: "paragraph", ofType: "txt")

    var fileContents : String? = nil
    do {
        fileContents = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
    } catch _ as NSError {
        //ERROR HANDLING
    }
     print(fileContents)

}

这是文件:

Lorem存有消费者§9(1)胡萝卜,consetetur sadipscing多年来,但是远投nonumy矿石等疼痛最令人兴奋的。 (2)项目的床直径。 55但是,他们中的真理两个,公正,感到痛苦和东西预览。在维罗EOS。 (3)上述1,疼痛是最令人兴奋,但该项目的直径。不过,说实话,两分钟,只是,和感觉,以及东西预览。 LOREM。

感谢您的时间!

答案

这是一个简单的方法,不幸的是它不使用CharacterView,因为这会使它复杂化:

func readFile(){
  // Make sure getting the path and reading the file succeeds
  guard
    let path = Bundle.main.path(forResource: "paragraph", ofType: "txt"),
    let fileContents = try? String(contentsOfFile: path, encoding: String.Encoding.utf8) 
    else { return }

  // split string into substrings that only contain numbers
  let substrings = fileContents.components(separatedBy: CharacterSet.decimalDigits.inverted)

  // flatMap performs action on each substring
  // and only returns non-nil values,
  // thus returns [Int]

  let numbers = substrings.flatMap {
    // convert each substring into an Int?
    return Int($0)
  }

  print(numbers)
}

因为Int的初始化程序需要String,所以不需要使用CharacterView。一旦文本中的数字从非数字中分割出来,就可以直接从String转换为Int。使用CharacterView将是一个不必要的中间人。但是,您可以编写自己的Int init?(String)版本,该版本使用CharacterView来构建值。

另一答案

细节

  • Xcode 10.2.1(10E1001),Swift 5

import Foundation

extension String {
    func onlyNumbers() -> [NSNumber] {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        let charset = CharacterSet.init(charactersIn: " ,")
        return matches(for: "[+-]?([0-9]+([., ][0-9]*)*|[.][0-9]+)").compactMap { string in
            return formatter.number(from: string.trimmingCharacters(in: charset))
        }
    }

    // https://stackoverflow.com/a/54900097/4488252
    func matches(for regex: String) -> [String] {
        guard let regex = try? NSRegularExpression(pattern: regex, options: [.caseInsensitive]) else { return [] }
        let matches  = regex.matches(in: self, options: [], range: NSMakeRange(0, self.count))
        return matches.compactMap { match in
            guard let range = Range(match.range, in: self) else { return nil }
            return String(self[range])
        }
    }
}

用法

let text = "dasdxcw 12345678 eadwd 333.222 reqw 3 333 444.22, sfsa 44. qewqwdsaw qe aw, 0.123456678 and .23 asdasdas 32,322,222,444.8"
print("Original text: (text)")
print("Only numbers: (text.onlyNumbers())")

结果

//Original text: dasdxcw 12345678 eadwd 333.222 reqw 3 333 444.22, sfsa 44. qewqwdsaw qe aw, 0.123456678 and .23 asdasdas 32,322,222,444.8
//Only numbers: [12345678, 333.222, 3333444.22, 44, 0.123456678, 0.23, 32322222444.8]

以上是关于从String中提取数字并将其保存到数组中的主要内容,如果未能解决你的问题,请参考以下文章

3.20作业解答

如何从文件中提取String和Int,并将其放入2D Array中。

如何将数据库中的数据提取到 javascript 文件中并将其存储在数组中?

当我从用户获取数据并将其保存到 SQLite 数据库中时,我应该怎么做才能使列表视图在片段中工作

如何从 .t​​xt 中提取文本并将其存储到动态二维数组中?

如何从嵌入式资源中提取文件并将其保存到磁盘?