2014-12-06 2 views
2

"XbfdASF; FBACasc | Piida; bfedsSA | XbbnSF; vsdfAs |"이렇게 형식이 지정된 문자열이 있습니다.Swift - 문자열의 두 위치 사이에서 부분 문자열 찾기

Basiclly 그 ID; 그런 다음 반복됩니다.

첫 번째 ID가 있고 그 파트너를 찾아야합니다. 예 : 'Piida'가 있고 ';'다음에 오는 문자열을 찾아야합니다. 어느 것이 'bfedsSA'입니까

어떻게해야합니까?

내가 겪고있는 문제는 ID의 길이가 동적이어서 '|'색인을 가져와야한다는 것입니다. 내가 가지고있는 ID가 'Piida'인 경우이 인덱스 사이에있는 문자열을 가져와야합니다.이 인덱스는이 경우 'bfedsSA'여야합니다.

+0

그 자리를 가지고 있지만 O를 포기하는 것이 현명 할 것 문자열에 대한 유형을 구조화합니다. 따라서 문자열을 나누면 '배열 배열'을 사용하거나 첫 번째 요소가 모두 고유 한 경우 하나의 사전 만 사용하려고합니다. 왜 '분할하는 법'에 대한 질문에서 이것을 언급해야합니까? 'StringLiteralConvertible' 프로토콜 때문에! 사전에 해당 프로토콜을 구현 (또는 자신의 데이터 구조체를 개선) 한 다음 'var data : [String : String] = "XBfdASF; .... As | – GoZoner

답변

3

여러 가지 방법이 있지만 가장 쉬운 방법은 구분 기호를 사용하여 문자열을 배열로 분할하는 것입니다.

JavaScript를 알고있는 경우 .split() 문자열 메소드와 같습니다. 스위프트 does have this functionality, 그러나 거기에서 보시다시피, 조금 지저분해질 수 있습니다. 문자열 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"] 

을, 가장 먼저 할 것은 세그먼트로 당신의 ID 문자열을 분할 이제

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

, 당신은 다음과 같을 것입니다 귀하의 ID의 문자열 배열이 있습니다 : 그것은 당신의 ID를 분리하는 방법 때문에 분리에 의해, 이는, | 될 것입니다

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

귀하의 ID는 형식 ID;VALUE에, 그래서 당신은 다음과 같이 다시 분할 할 수 있습니다 :

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

당신은 인덱스 1

에 해당 배열의 인덱스 0 값의 ID에 액세스 할 수 있습니다

예 : 문자열로 데이터 구조를 인코딩

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

좋은 답변입니다. 빠른 질문 : 배열에서 ID 색인을 찾으려면 어떻게합니까? 즉 ID가 'Piida'입니다. 배열에서 색인을 찾는 간단한 방법은 무엇입니까? –