2017-04-19 21 views
-4

鉴于从互联网上获得的字符串编辑号码,如:斯威夫特 - 解析字符串提取并在它

“雪让位到中雨(共10毫米)于星期四晚上最重的除尘冻结。 -thaw条件(周五早晨最高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 
} 
+2

你为什么不使用像雅虎天气的API? –

+1

顺便说一句,你应该发布你的代码。你曾经尝试过什么,它没有工作。 –

+0

我没有使用API​​,因为这个应用程序仅仅是我的学生在从网页抓取内容时的一个教训。我们将在未来的课程中使用API​​。 –

回答

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转换 - >Range<String.Index>