2014-12-06 2 views
2

У меня есть строка, которая отформатирована следующим образом: «XbfdASF; FBACasc | Piida; bfedsSA | XbbnSF; vsdfAs |»Swift - поиск подстроки между двумя местоположениями в строке

Basiclly ID: ID | и затем повторяется.

У меня есть первый идентификатор, и мне нужно найти его партнера Пример: у меня есть «Piida», и мне нужно найти строку, которая следует за ней после ';' который является «bfedsSA»

Как это сделать?

Проблема, с которой я сталкиваюсь, заключается в том, что длина идентификаторов является динамической, поэтому мне нужно получить индекс '|' после идентификатора, который есть «Piida», а затем получить строку, которая находится между этими индексами, которая в этом случае должна быть «bfedsSA».

+0

Кодирование структуры данных в строку имеет свое место, но вы бы неразумно отказываться от уплотнительного эти типы структурирования для строки. Итак, как только вы получите разделение строк, вы захотите использовать «Массив пар» или, если все первые элементы уникальны, просто один словарь. Почему я упоминаю об этом в вопросе о том, как разделить? Из-за протокола 'StringLiteralConvertible'! Внесите этот протокол в словарь (или, лучше, свою собственную структуру данных), а затем вы можете использовать 'var data: [String: String] =" XBfdASF; .... As | " – GoZoner

ответ

3

Существует много способов сделать это, но проще всего разбить строку на массив с помощью разделителя.

Если вы знаете JavaScript, это эквивалент метода строки .split(); Swift does have this functionality, но, как вы видите, это может стать немного грязным. Вы можете расширить String like this, чтобы сделать его немного проще. Для полноты картины, я включу его здесь:

import Foundation 

extension String { 
    public func split(separator: String) -> [String] { 
     if separator.isEmpty { 
      return map(self) { String($0) } 
     } 
     if var pre = self.rangeOfString(separator) { 
      var parts = [self.substringToIndex(pre.startIndex)] 
      while let rng = self.rangeOfString(separator, range: pre.endIndex..<endIndex) { 
       parts.append(self.substringWithRange(pre.endIndex..<rng.startIndex)) 
       pre = rng 
      } 
      parts.append(self.substringWithRange(pre.endIndex..<endIndex)) 
      return parts 
     } else { 
      return [self] 
     } 
    } 
} 

Теперь вы можете вызвать .split() на струнах, как это:

"test".split("e") // ["t", "st"] 

Итак, что вы должны сделать первый расщепляется свой идентификатор строки на сегменты ваш сепаратор, который будет |, потому что это, как разделяются ваши идентификаторы:

let ids: [String] = "XbfdASF;FBACasc|Piida;bfedsSA|XbbnSF;vsdfAs|".split("|") 

Теперь у вас есть массив строк ваших идентификаторов, которые будут выглядеть следующим образом:

["XbfdASF;FBACasc", "Piida;bfedsSA", "XbbnSF;vsdfAs"] 

Ваши идентификаторы в формате ID;VALUE, так что вы можете разделить их снова, как это:

let pair: [String] = ids[anyIndex].split(";") // ["ID", "VALUE"] 

Вы можете получить доступ к ID по индексу 0 в массиве и значение индекс 1.

Пример:

let id: String = ids[1].split(";")[0] 
let code: String = ids[1].split(";")[1] 

println("\(id): \(code)") // Piida: bfedsSA 
+2

На самом деле Swift * имеет * функцию split(), которую вы можете использовать здесь (см., Например, http://stackoverflow.com/a/25229901/1187415). –

+0

@MartinR Вау, это интересно. Я думаю, что расширение String упрощает синтаксис, но я буду помнить об этом. – AstroCB

+0

Отличный ответ. Быстрый вопрос: как найти индекс идентификатора в массиве? i.e У меня есть ID 'Piida'. Каков короткий способ найти его индекс в массиве? –

Смежные вопросы