2016-11-11 158 views
0

我有一個字符串let string = "!101eggs"。現在,我想要有一個像這樣的數組["!", "101", "e", "g", "g", "s"]。我怎樣才能做到這一點?Swift 3:按字符串將字符串拆分爲數組

+0

什麼是你正確的答案,如果輸入 '-1-2a000 + 4-1'? – Cruz

+0

@SwiftyCruz它會是'[「 - 」,「1」,「 - 」,「2」,「a」,「000」,「+」,「4」,「 - 」,「1」] –

+0

如果你更詳細地描述模式,我想你會得到更好的答案。 – Alexander

回答

1

對不起它太長

當輸入

print("-1-2a000+4-1/000!00005gf101eg14g1s46nj3j4b1j5j23jj212j4b2j41234j01010101g0000z00005g0000".toArrayByNumber()) 

結果:["-", "1", "-", "2", "a", "000", "+", "4", "-", "1", "/", "000", "!", "00005", "g", "f", "101", "e", "g", "14", "g", "1", "s", "46", "n", "j", "3", "j", "4", "b", "1", "j", "5", "j", "23", "j", "j", "212", "j", "4", "b", "2", "j", "41234", "j", "01010101", "g", "0000", "z", "00005", "g", "0000"]

extension Int { 
    func toZeroString() -> String { 
     return (0 ..< self).reduce("", { (result, zero) -> String in 
      return result + "0" 
     }) 
    } 
} 

extension String { 

    func toArrayByNumber() -> [String] { 

     var array: [String] = [] 
     var num = 0 
     var zeroCount = 0 
     var zeroEnd = false 

     for char in self.characters { 
      if let number = Int("\(char)") { 
       if zeroEnd == false && number == 0 { 
        zeroCount += 1 
       } else { 
        num = num * 10 + number 
        zeroEnd = true 
       } 

      } else { 
       if num != 0 { 
        array.append(zeroCount.toZeroString() + ("\(num)")) 
       } else if zeroCount > 0 { 
        array.append(zeroCount.toZeroString()) 
       } 


       array.append(String(char)) 
       num = 0 
       zeroCount = 0 
       zeroEnd = false 
      } 
     } 

     if num != 0 { 
      array.append(zeroCount.toZeroString() + ("\(num)")) 
     } else if zeroCount > 0 { 
      array.append(zeroCount.toZeroString()) 
     } 

     return array 
    } 
} 
+0

這很好!非常感謝。 –

2

我認爲你最難的部分是「號碼在哪裏」?只要這僅僅是數字的簡單序列,正則表達式可以很容易地發現:

let string = "!101eggs" 
let patt = "\\d+" 
let reg = try! NSRegularExpression(pattern:patt) 
let r = reg.rangeOfFirstMatch(in: string, 
    options: [], 
    range: NSMakeRange(0,string.utf16.count)) // {1,3} 

所以,現在你知道這個數字開始在位置1和長3個字符。剩下的部分作爲讀者的練習。