#arrays #swift #string #algorithm #components
#массивы #swift #строка #алгоритм #Компоненты
Вопрос:
Как вы могли бы разделить строку на массив, сохранив разделяющую строку?
Вы можете разделить строку, выполнив это, но при этом не сохраняется разделительная подстрока:
«My-Name».components(разделенные: «-«) -> [«My», «Name»]
Это то, чего я пытаюсь достичь:
Пример 1: «My-Name».someSplitFunc(разделяется на: «-«) -> [«My-«, «Name»]
Пример 2: «Это-предложение».someSplitFunc(разделяется: «-«) -> [«Это-«, «это-«, «a-«, «предложение»]
Ответ №1:
Вы можете попробовать это:
var str = "This-is-a-sentence"
var separateList = str.components(separatedBy: "-")
for (index, _) in separateList.enumerated() {
if index < separateList.count - 1 {
separateList[index].append("-")
}
}
print(separateList)
Комментарии:
1. Обратите внимание, что для этого потребуется основа. Не родной Swift. Это также приведет к
[""]
тому, что исходная строка будет пустой.2. Он также добавит пустую строку к результату, если строка заканчивается на «-»
3. Кстати
for index in separateList.indices.dropLast() {
Ответ №2:
Просто используйте это расширение ниже.
extension String {
func componentSeparate(by: String) -> [String] {
var out: [String] = [String]()
var storeStr = ""
for str in Array(self) {
if by.contains(str) {
out.append(storeStr)
storeStr.removeAll()
continue
}
storeStr.append(str)
}
return out
}
func componentSeparated1(by: String) -> [String] {
var separateList: [String] = componentSeparate(by: by).map { "($0)(by)" }
separateList[separateList.count-1].removeLast(by.count)
return separateList
}
func componentSeparated2(by: String) -> [String] {
if self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { return [] }
var separateList: [String] = componentSeparate(by: by).map { "($0)(by)" }
separateList[separateList.count-1].removeLast(by.count)
return separateList
}
func componentSeparated3(by: String) -> [String] {
if self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { return [] }
var separateList: [String] = componentSeparate(by: by).map {"($0)(by)"}.filter {$0 != "-"}
separateList[separateList.count-1].removeLast(by.count)
return separateList
}
func componentSeparated4(by: String) -> [String] {
if self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { return [] }
let separateList: [String] = componentSeparate(by: by).map {"($0)(by)"}.filter {$0 != "-"}
return separateList
}
}
print("This-is-a-sentence-".componentSeparated1(by: "-"))
print("".componentSeparated2(by: "-"))
print("This-is-a-sentence-".componentSeparated3(by: "-"))
print("This-is-a-sentence-".componentSeparated4(by: "-"))
Вывод:
["This-", "is-", "a-", "sentence-", ""]
[]
["This-", "is-", "a-", "sentence"]
["This-", "is-", "a-", "sentence-"]
Комментарии:
1. Это приведет к «-«, если это пустая строка
2. Это приведет к той же строке плюс «-«, если она не найдет ни одного «-»
3. Обратите внимание, что
components(separatedBy:)
это базовый метод. Не является роднымSwift
. Вероятно, это не имеет значения для OP, но стоит упомянуть для будущих читателей. Кстати, ни один из ваших методов не возвращает["This-", "is-", "a-", "sentence-"]