2014-12-29 5 views
0

фонКак разбить строку в массив на основе токена?

Например, предположим, что у меня есть:

let tgt  = "Europa" 
let token = "ro" 
let a  = split_on(tgt, token) // how to implement this? 
let exp_res = [ "Eu", "ro", "pa" ] 

Я рассматривал String.componentsSeparatedByString но позиции сплит теряются (т.е. мы не знаем, если token появился в начале, конце или если это произошло несколько раз подряд

Редактировать:. Дополнительные примеры

split_on("roroEuropa", "ro") // [ "ro", "ro", "Eu", "ro", "pa" ] 
split_on("rorEuropa", "ro") // [ "ro", "rEu", "ro", "pa" ] 
split_on("Euroroparo", "ro") // [ "Eu", "ro", "ro", "pa", "ro" ] 
+0

Так что выход можно ожидать, если маркер появляется в начале, конце, или, если это происходит несколько раз подряд? Еще несколько примеров были бы полезны. –

+0

@MartinR Я ожидал бы нескольких «ро», даже повторяющихся в массиве - в начале, в конце или везде, где они появляются. Я не хочу терять какие-либо экземпляры - они должны появляться на выходе. Токены служат только нашей точкой (точками) расщепления. – kfmfe04

ответ

1

Это было бы возможным решением. Вы могли бы написать это в одной строке, но я разделить его на отдельные заявления, чтобы продемонстрировать, как это работает:

let tgt  = "roEuroroparo" 
let token = "ro" 

// Split into an array of strings: 
let t1 = tgt.componentsSeparatedByString(token) 
println(t1)     // [, Eu, , pa, ] 

// Convert each string to an array: 
let t2 = map(t1) { [$0] } 
println(t2)     // [[], [Eu], [], [pa], []] 

// Interpose the token: 
let t3 = [token].join(t2) 
println(t3)     // [, ro, Eu, ro, , ro, pa, ro, ] 

// Remove empty strings: 
let result = filter(t3) { countElements($0) > 0 } 
println(result)    // [ro, Eu, ro, ro, pa, ro] 
+0

выглядит великолепно - tyvm – kfmfe04