我对Swift3比较陌生,我无法做出如何实现以下内容的正面或反面:
我有一个看起来像这样的字符串:
"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 :(得分: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)
}
答案 1 :(得分: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)))
}