Разделение строки в Swift с сохранением разделенной строки

#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-"]