Swift - 解析String以提取和编辑其中的数字

时间:2017-04-19 18:23:58

标签: swift string string-parsing

给出从互联网上获取的字符串,例如:

星期四晚上,一场雪的降尘使得中雨(总共10毫米)变得最重。冻融条件(周五早上最高8°C,周三晚上最低-2°C)。主要是强风。

使用Swift 3,我希望将温度转换为华氏温度。所以我需要找到其后有°C的数字(包括负数);将它们转换为华氏温度,然后将整数替换回字符串。

我最初尝试使用:components(separatedBy:String)。我确实让它使用这种方法。虽然我认为可能有更好的方法。

func convertStringToFahrenheit (_ message: String) -> String{
    var stringBuilder = String()
    let stringArray = message.components(separatedBy: "°C")
    for subString in stringArray {
        if subString != stringArray.last {
            if subString.contains("(max "){
                let subStringArray = subString.components(separatedBy: "(max ")
                stringBuilder.append(subStringArray[0])
                stringBuilder.append("(max ")
                if var tempInt = Int(subStringArray[1]){
                    tempInt = convertCelsiusToFahrenheit(tempInt)
                    stringBuilder.append(String(tempInt))
                    stringBuilder.append("°F")
                }
            }
            else if subString.contains(", min "){
                let subStringArray = subString.components(separatedBy: ", min ")
                stringBuilder.append(subStringArray[0])
                stringBuilder.append(", min ")
                if var tempInt = Int(subStringArray[1]){
                    tempInt = convertCelsiusToFahrenheit(tempInt)
                    stringBuilder.append(String(tempInt))
                    stringBuilder.append("°F")
                }
            }
        }
        else {
            stringBuilder.append(subString)
        }
    }
    return stringBuilder
}

1 个答案:

答案 0 :(得分:1)

正则表达的工作。

模式"(-?\\d+)°C"搜索

  • 可选的减号-?
  • 后跟一个或多个数字\\d+
  • 后跟°C

该组 - 在括号内 - 捕获度数值。

var string = "A dusting of snow giving way to moderate rain (total 10mm) heaviest on Thu night. Freeze-thaw conditions (max 8°C on Fri morning, min -2°C on Wed night). Mainly strong winds."

let pattern = "(-?\\d+)°C"

do {
    let regex = try NSRegularExpression(pattern: pattern)
    let matches = regex.matches(in: string, range: NSRange(location: 0, length: string.utf16.count))
    for match in matches.reversed() { // reversed() is crucial to preserve the indexes.
        let celsius = (string as NSString).substring(with: match.rangeAt(1))
        let fahrenheit = Double(celsius)! * 1.8 + 32
        let range = match.range
        let start = string.index(string.startIndex, offsetBy: range.location)
        let end = string.index(start, offsetBy: range.length)
        string = string.replacingCharacters(in: start..<end, with: String(format: "%.0f°F", fahrenheit))
    }
} catch {
    print("Regex Error:", error)
}

print(string)

代码中最复杂的部分是转化NSRange - &gt; Range<String.Index>