2017-04-18 110 views
1

我是比較新的Swift3,我不能讓元首或如何實現以下尾巴:斯威夫特3 - 檢索字符串的特定部分

我有一個字符串,看起來像這樣:

"45007KÖPENHAMN H45012KÖPENHAMN NØRREPORT45011KÖPENHAMN ØSTERPORT45006CPH AIRPORT91220SIMRISHAMN BISKOP ESKILSGATAN439872KÖPENHAMNSKAJEN 1 HELSINGBORG217696KÖPENHAMNSVÄGEN 1 MALMÖ217741KÖPENHAMNSVÄGEN 2 MALMÖ217774KÖPENHAMNSVÄGEN 3A MALMÖ217775KÖPENHAMNSVÄGEN 3B MALMÖ222954ARKEN, KÖPENHAMN192513COPENHAGEN MALMÖ PORT (CMP) MALMÖ192654ARILDS GÄSTHAMN HÖGANÄS192657DOMSTENS GÄSTHAMN HELSINGBORG181286FRISKVÅRDSENHET LIMHAMN95006GÖTEBORG C87071TRELLEBORG C80520MALMÖ LINDEBORG CENTRUM33437VYSTEBORGSVÄGEN 27 BÅSTAD435959SKARHULT SKATTEBORG FLYINGE238027LINDEBORGSGATAN 1 MALMÖ306369LILJEBORGSGATAN 1 TRELLEBORG235750SÖVDEBORGSGATAN 3 MALMÖ37006BIBLIOTEK TRELLEBORG193244BÖSTE BED & BREAKFAST TRELLEBORG193083HOTELL & PENSIONAT MAGLARP TRELLEBORG67151HOTELL HORIZONT TRELLEBORG48053KATTEBÄCKSSKOLAN TRELLEBORG"

格式爲5(或6) - 數位碼,則該地點的名稱的代碼屬於。

我需要做的是找到一個特定的名稱是什麼,說:「FRISKVÅRDSENHETLIMHAMN」和檢索在它前面的代碼(在這種情況下,181286)

我已經廣泛搜查,但字符串的所有實例搜索/索引我發現涉及從字符串的開始/結尾移動一個設定的距離,這在我的情況下沒有幫助。

預先感謝您。

回答

0

這對於正則表達式來說非常簡單。

您必須先搜索5-6位數字後跟查詢字符串

"(\\d{5,6})" + query 

該對周圍的正則表達式模式括號捕獲其可稍後在比賽在範圍索引1

let string = "45007KÖPENHAMN H45012KÖPENHAMN NØRREPORT45011KÖPENHAMN ØSTERPORT45006CPH AIRPORT91220SIMRISHAMN BISKOP ESKILSGATAN439872KÖPENHAMNSKAJEN 1 HELSINGBORG217696KÖPENHAMNSVÄGEN 1 MALMÖ217741KÖPENHAMNSVÄGEN 2 MALMÖ217774KÖPENHAMNSVÄGEN 3A MALMÖ217775KÖPENHAMNSVÄGEN 3B MALMÖ222954ARKEN, KÖPENHAMN192513COPENHAGEN MALMÖ PORT (CMP) MALMÖ192654ARILDS GÄSTHAMN HÖGANÄS192657DOMSTENS GÄSTHAMN HELSINGBORG181286FRISKVÅRDSENHET LIMHAMN95006GÖTEBORG C87071TRELLEBORG C80520MALMÖ LINDEBORG CENTRUM33437VYSTEBORGSVÄGEN 27 BÅSTAD435959SKARHULT SKATTEBORG FLYINGE238027LINDEBORGSGATAN 1 MALMÖ306369LILJEBORGSGATAN 1 TRELLEBORG235750SÖVDEBORGSGATAN 3 MALMÖ37006BIBLIOTEK TRELLEBORG193244BÖSTE BED & BREAKFAST TRELLEBORG193083HOTELL & PENSIONAT MAGLARP TRELLEBORG67151HOTELL HORIZONT TRELLEBORG48053KATTEBÄCKSSKOLAN TRELLEBORG" 

let query = "FRISKVÅRDSENHET LIMHAMN" 

let pattern = "(\\d{5,6})" + query 

do { 
    let regex = try NSRegularExpression(pattern: pattern, options: []) 
    if let match = regex.firstMatch(in: string, range: NSRange(location: 0, length: string.characters.count)) { 
     let range = match.rangeAt(1) 
     let start = string.index(string.startIndex, offsetBy: range.location) 
     let end = string.index(start, offsetBy: range.length) 
     print(string.substring(with: start..<end)) 
    } else { 
     print("\(query) not found") 
    } 
} catch { 
    print("Regex Error:", error) 
} 
+0

https://xkcd.com/208/謝謝你好先生! – RBurns

0

嘗試此代碼的數目:

http://swift.sandbox.bluemix.net/#/repl/58f5ebe15d728d386669ab90

// Write some awesome Swift code, or import libraries like "Foundation", 
// "Dispatch", or "Glibc" 
import Foundation 

let input = "45007KÖPENHAMN H45012KÖPENHAMN NØRREPORT45011KÖPENHAMN ØSTERPORT45006CPH AIRPORT91220SIMRISHAMN BISKOP ESKILSGATAN439872KÖPENHAMNSKAJEN 1 HELSINGBORG217696KÖPENHAMNSVÄGEN 1 MALMÖ217741KÖPENHAMNSVÄGEN 2 MALMÖ217774KÖPENHAMNSVÄGEN 3A MALMÖ217775KÖPENHAMNSVÄGEN 3B MALMÖ222954ARKEN, KÖPENHAMN192513COPENHAGEN MALMÖ PORT (CMP) MALMÖ192654ARILDS GÄSTHAMN HÖGANÄS192657DOMSTENS GÄSTHAMN HELSINGBORG181286FRISKVÅRDSENHET LIMHAMN95006GÖTEBORG C87071TRELLEBORG C80520MALMÖ LINDEBORG CENTRUM33437VYSTEBORGSVÄGEN 27 BÅSTAD435959SKARHULT SKATTEBORG FLYINGE238027LINDEBORGSGATAN 1 MALMÖ306369LILJEBORGSGATAN 1 TRELLEBORG235750SÖVDEBORGSGATAN 3 MALMÖ37006BIBLIOTEK TRELLEBORG193244BÖSTE BED & BREAKFAST TRELLEBORG193083HOTELL & PENSIONAT MAGLARP TRELLEBORG67151HOTELL HORIZONT TRELLEBORG48053KATTEBÄCKSSKOLAN TRELLEBORG" 

let name = "FRISKVÅRDSENHET LIMHAMN" 

func isDigit(_ c: Character) -> Bool { 
    let unicodeScalars = String(c).unicodeScalars 
    let unicodeScalar = unicodeScalars[unicodeScalars.startIndex] 
    return CharacterSet.decimalDigits.contains(unicodeScalar) 
} 

if let range = input.range(of: name) { 
    var index = input.index(before: range.lowerBound) 

    while (index != input.startIndex && isDigit(input[index])) { 
     index = input.index(before: index) 
    } 

    if (index != input.startIndex) { 
     index = input.index(after: index) 
    } 

    print(input.substring(with: index..<input.index(before: range.lowerBound))) 


} 
+0

謝謝你的幫助。不幸的是,你的方法返回缺少第一個數字的代碼(如果它是5位代碼則是4位,如果是6位數代碼則是5) – RBurns