Разделить строку на основе символов $$ и && для доступа к данным в Swift - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть строка с идентификатором и именем презентации. Формат строки: $$ Id && presentationName

$$ 5955 && Имя презентации1 [CLONE] $$ 7460 && Имя презентации2 $$ 7473 && Имя презентации3 $$ 7626 && Имя презентации4 [CLONE] $$ 7460 && Название презентации5 $$ 7123 && Имя презентации5 100 * * 4 * 100 * * Я хочу разбить строку на два массива с Id и именем презентации на основе символов $$ и &&. Я новичок в iOS, пожалуйста, помогите.

Ожидаемый результат: arrayID = [5955, 7460, 7473, 7626, 7460, 7123]

arrayPresentationNames = ["Имя презентации1 [КЛОН]", "Имя презентации2", "Имя презентации3", "Имя презентации5", "Имя презентации5", "Имя презентации6"]

Я пробовал, как показано ниже но не удалось.

    let separators = NSCharacterSet(charactersInString: "&&")
    var fullStr: String = "$$3232&&presentation name";
    var words = fullStr.componentsSeparatedByCharactersInSet(separators)

Ответы [ 4 ]

1 голос
/ 15 апреля 2020

Это решение, которое анализирует строку в пользовательскую структуру с регулярным выражением

struct Presentation {
    let id : Int
    let name : String
}

let string = "$$5955&&Presentation Name1 [CLONE]$$7460&&Presentation Name2 $$7473&&Presentation Name3$$7626&&Presentation Name4 [CLONE]$$7460&&Presentation Name5$$7123&&Presentation Name6"

let regex = try! NSRegularExpression(pattern: "\\$\\$(\\d+)&&([^\\$]+)")
let matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string))
let presentations = matches.map { match -> Presentation in
    let numberRange = Range(match.range(at: 1), in: string)!
    let nameRange = Range(match.range(at: 2), in: string)!
    return Presentation(id: Int(string[numberRange])!, name: String(string[nameRange]))
}

print(presentations)
0 голосов
/ 24 апреля 2020
let str = "$$5955&&Presentation Name1 [CLONE]$$7460&&Presentation Name2 $$7473&&Presentation Name3$$7626&&Presentation Name4 [CLONE]$$7460&&Presentation Name5$$7123&&Presentation Name6"

let splits = str.components(separatedBy: "$$").dropFirst().map { $0.components(separatedBy: "&&") }
let arrayID = splits.map { $0.first }
let arrayPresentationNames = splits.map { $0.last }

print(splits)                   // [["5955", "Presentation Name1 [CLONE]"], ["7460", "Presentation Name2 "]...]
print(arrayID)                  // ["5955", "7460"...]
print(arrayPresentationNames)   // ["Presentation Name1 [CLONE]", "Presentation Name2 "...]
0 голосов
/ 15 апреля 2020

Используя функциональное программирование, вы можете получить решение этой проблемы, сначала удалив амперсанды, а затем используя плоскую карту для удаления знаков доллара. Предоставленная функция будет работать с любыми двумя наборами символов и возвращает кортеж со значениями, которые вы ищете.

func removeUnwantedCharacters(remove firstValue:String, and secondValue: String, from string : String) -> (ids:[Int],names:[String]){

    let removeFirstValue = string.components(separatedBy: firstValue)
    let removeAmpersand = removeFirstValue.flatMap { (item) -> [String] in
        item.components(separatedBy: secondValue)
    }

    var presentationNames : [String] = []

    let id = removeAmpersand.compactMap { item -> Int? in

        if Int(item) != nil {
            return Int(item)
        }else{
            if item != "" {
                presentationNames.append(item)
            }
            return nil
        }
    }

    return (id,presentationNames)
}
0 голосов
/ 15 апреля 2020

Вы можете использовать метод компоненты , чтобы разделить вашу строку.

Шаг 1: Разделите его с помощью разделителя " $$ ", который даст вам массив строк. Элемент экземпляра в этом массиве будет выглядеть примерно так: " 7460 && Presentation Name2 ".

Шаг 2: Разделите этот массив снова, теперь с помощью разделителя " && ", который дает вам массив ["7460", "Presentation Name2"].

Шаг 3. Из этого массива необходимо извлечь значения и присвоить их вашим массивам.

let yourString = "$$5955&&Presentation Name1 [CLONE]$$7460&&Presentation Name2 $$7473&&Presentation Name3$$7626&&Presentation Name4 [CLONE]$$7460&&Presentation Name5$$7123&&Presentation Name6"
var arrayPresentationNames: [String] = []
var arrayID: [String] = []

// Step 1 - Separate the string by the "$$"
yourString.components(separatedBy: "$$").forEach({ element in
    // Step 2 - Separate the string by the "&&"
    let splitedComponent = element.components(separatedBy: "&&")
    if let presentationName = splitedComponent.first, !presentationName.isEmpty {
        // Step 3/1 - Extract the presentation name
        arrayPresentationNames.append(presentationName)
    }
    if splitedComponent.count > 1 {
        // Step 3/2 - Extract the id
        arrayID.append(splitedComponent[1])
    }
})
print(arrayPresentationNames) // Prints your presentation names
print(arrayID) // Prints your id's
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...