2017-04-18 68 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