2017-01-11 8 views
1

string.components(separatedBy: ...)とは異なり、結果の配列にセパレータを保持したいと考えています。コードはより説明的ですコンポーネントごとに文字列を分割し、コンポーネントを適切な場所に保持する

let input = "foo&bar|hello" 
let output = string.tokenize(splitMarks: ["&", "|"]) 
let desiredResult = ["foo", "&", "bar", "|", "hello"] 

これを行う関数はありますか?そのような機能を実装するにはどうすればいいですか?

+0

このためのRegexリファレンスブック。 'NSRegularExpression'をチェックしてください。時には(ときどき)それは答えです... –

+0

にコンポーネントを追加

let input = "foo&bar|hello" let output = input.tokenize(splitMarks: "&|") print(output) // ["foo", "&", "bar", "|", "hello"] 
Grimxn

答えて

5

そのためには、Stringをループして、それぞれがcharactersのトークンであるかどうかを確認する必要があります。このようにをStringにすることができます。

extension String { 

    func stringTokens(splitMarks: Set<String>) -> [String] { 

     var string = "" 
     var desiredOutput = [String]() 
     for (index, ch) in self.characters.enumerated() { 
      if splitMarks.contains(String(ch)) { 
       if !string.isEmpty { 
        desiredOutput.append(string) 
       } 
       desiredOutput.append(String(ch)) 
       string = "" 
      } 
      else { 
       string += String(ch) 
      } 
     } 
     if !string.isEmpty { 
      desiredOutput.append(string) 
     } 
     return desiredOutput 
    } 
} 

このようにこの関数を呼び出すことができます。あなたは文字列で分割されたマークの次の出現を見つける にループ内rangeOfCharacter(from: CharacterSet, ...)を使用し、次いで 追記前の部分とに分離することができ、両方

let input = "foo&bar|hello" 
print(input.stringTokens(splitMarks: ["&", "|"])) 

出力

["foo", "&", "bar", "|", "hello"] 
3

配列:

extension String { 

    func tokenize(splitMarks: String) -> [String] { 

     let cs = CharacterSet(charactersIn: splitMarks) 
     var result = [String]() 
     var pos = startIndex 
     while let range = rangeOfCharacter(from: cs, range: pos..<endIndex) { 
      // Append string preceding the split mark: 
      if range.lowerBound != pos { 
       result.append(self[pos..<range.lowerBound]) 
      } 
      // Append split mark: 
      result.append(self[range]) 
      // Update position for next search: 
      pos = range.upperBound 
     } 
     // Append string following the last split mark: 
     if pos != endIndex { 
      result.append(self[pos..<endIndex]) 
     } 
     return result 
    } 
} 

例:

0私はこれらのコンポーネントを保持機能があるとは思わない...しかし、あなたができるあなたの配列をループし、私は正規表現ジョッキーだありませんが、私は私のほこりを払いたいあなたの文字列
+0

'rangeOfCharacter'をうまく使います。 –

関連する問題