Мне нравятся регулярные выражения для такого рода вещей.
Я собираюсь взять вас буквально и предположить, что найденным подстрокам предшествуют "A.1"
, "B.2"
, "E"
и "C"
, и перед ними стоит пробел, за которым следует пробел, за исключением последней подстроки, за которой следует конец исходной строки.Более того, я собираюсь очень просто предположить, что такие разделители, как "E"
, не могут появляться в нашей строке любым другим способом.Затем мы можем захватить каждую подстроку с соответствующим шаблоном:
let s = "A.1 harpo B.2 chico E zeppo C groucho"
let p1 = "^A\\.1 (.*) B\\.2 "
let p2 = " B\\.2 (.*) E "
let p3 = " E (.*) C "
let p4 = " C (.*)$"
let patts = [p1,p2,p3,p4]
var result = [String]()
for patt in patts {
let regex = try! NSRegularExpression(pattern: patt, options: [])
if let match = regex.firstMatch(in: s, options: [],
range: NSRange(s.startIndex..<s.endIndex, in: s)) {
let r = match.range(at: 1)
result.append((s as NSString).substring(with: r))
}
}
// result is now ["harpo", "chico", "zeppo", "groucho"]
Теперь у нас есть четыре искомых подстроки, извлеченных в массив, и работа с ними оттуда тривиальна.
Заметьте, что мыне делайте предположений о пробелах.Вышеприведенное работает отлично, даже если целевые подстроки содержат пробелы, потому что мы обращаемся только к разделителям.Например, если исходная строка имеет вид
let s = "A.1 the rain B.2 in spain E stays mainly C in the plain"
, тогда result
- это массив
["the rain", "in spain", "stays mainly", "in the plain"]
. Однако я должен указать на другой способ сделать эту сортировкудело в том, чтобы пройти оригинальную строку со сканером.Вы можете предпочесть это, потому что регулярные выражения здесь на самом деле не нужны, и если вы не знаете регулярные выражения, вы найдете этот способ обхода намного более понятным.Так что здесь переписано использование сканера.Обратите внимание, что в итоге мы имеем четыре необязательных объекта NSString, потому что Scanner на самом деле является объектом Objective-C Cocoa Foundation, но нетрудно превратить их в объекты String при необходимости:
let s = "A.1 the rain B.2 in spain E stays mainly C in the plain"
let scan = Scanner(string: s)
scan.scanString("A.1 ", into: nil)
var r1 : NSString? = nil
scan.scanUpTo(" B.2 ", into: &r1)
scan.scanString("B.2 ", into: nil)
var r2 : NSString? = nil
scan.scanUpTo(" E ", into: &r2)
scan.scanString("E ", into: nil)
var r3 : NSString? = nil
scan.scanUpTo(" C ", into: &r3)
scan.scanString("C ", into: nil)
var r4 : NSString? =
(scan.string as NSString).substring(from: scan.scanLocation) as NSString
r1 // the rain
r2 // in spain
r3 // stays mainly
r4 // in the plain