Найти подстроку в строке и вставить туда значение
Есть строка, у него есть подстрока table в строке их может быть N-ое количество.
так же есть массив значений назовем его setValues, setValues.count будет равен количеству table в строке.
Задача состоит отследить все эти table и вставить после него значение из массива по индексу. К примеру если это первая подстрока table то после него вставляем setValues[0] и тд.
Проект на гитхаб
Вот что я сделал:
var string = "table table table"
let substring = "table"
let setValues = ["_o_", "_fo_", "_sen_"]
// Результат должен быть следующий:
// "table _o_ table _fo_ table _sen_"
var index = 0
var stepIndex = 0
var i = 0
var stringLoc = string
for char in string {
if substring.first == char {
let startOfFoundCharacter = string.index(string.startIndex, offsetBy: index)
let lengthOfFoundCharacter = string.index(string.startIndex, offsetBy: (substring.count + index))
let range = startOfFoundCharacter..<lengthOfFoundCharacter
// если в строке нашли подстроку "table"
if string.substring(with: range) == substring {
stepIndex = index + substring.count
let trueIndex = stringLoc.index(stringLoc.startIndex, offsetBy: stepIndex)
stringLoc.insert(contentsOf: setValues[i], at: trueIndex)
i += 1
}
}
index += 1
}
"Пробегаюсь" по всей строке ищу наш table достаю индекс вставляю нужное нам значение.
Но, надо учитывать, что, при каждой итерации наша строка меняется и stepIndex надо двигать
Ответы (1 шт):
Вот например так можно это реализовать, мы тут используем NSString для простоты операций с подстроками, тут мы используем range для ограничения области поиска после каждой замены
class ViewController: UIViewController {
let string = "table table table"
let substring = "table"
let setValues = ["_o_", "_fo_", "_sen_"]
var nsString: NSMutableString!
var range: NSRange!
override func viewDidLoad() {
super.viewDidLoad()
nsString = NSMutableString(string: string)
range = NSMakeRange(0, nsString.length)
for i in 0..<setValues.count {
insertSubstring(" \(setValues[i])", after: substring)
}
print(nsString)
}
func insertSubstring(_ valueString: String, after searchString: String) {
let nsRange = nsString.range(of: searchString, options: [], range: range)
nsString.insert(valueString, at: nsRange.upperBound)
let offset = nsRange.location + valueString.count
range = NSMakeRange(offset, nsString.length - offset)
}
}