Перечислять через строку, чтобы найти целые числа, изменить, а затем заменить их - Swift - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть строка, содержащая числа. Строка может различаться по длине, количество цифр и чисел также может быть в разных местах.

Я написал некоторый код для поиска числа, добавил к нему один, а затем вернул его в ту же позицию в исходной строке. Например, AA1BB становится AA2BB. Я новичок в Swift, поэтому не совсем уверен, что мой код - самый эффективный способ добиться этого, но он работает.

Однако, если у меня есть строка, подобная AA1BB2CC5H7, как вы могли бы добавить одну к каждому числу, чтобы в результате получился AA2BB3CC6H8? Я предполагаю, что-то вроде l oop, и в идеале с использованием регулярного выражения.

У меня есть код, который работает с первым номером только в строке:

var testString = "AA1BB"

let testRange = testString.startIndex ..< testString.endIndex

let numberValue = testString [testString.range(of:"\\d+", options: .regularExpression) ?? testRange ] //edited to have default value in case there is no number found//

var numberAsInt = Int(numberValue) ?? 0 //change number from string to integer - edited to have a default number as a value//

// if number is not equal to 0 - edited, changed from NSNotfound//

if numberAsInt != 0  {
    //add one to the number value
    numberAsInt += 1
    //change new number value back to a string
    let numberAsString = String(numberAsInt)
    //assign the changed number "numberAsString" back into original variable into original place using a range (same range method set up as the numberValue variable)
    testString = testString.replacingCharacters(in: testString.range(of:"\\d+", options: .regularExpression)! , with: numberAsString)
    print (testString)
}

Любые предложения или советы по наилучшему способу решения этой проблемы были бы удивительными. Спасибо!

1 Ответ

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

Хотя ответы, упомянутые в комментариях, совершенно хороши, позвольте мне предложить альтернативу, используя нашего старого друга Scanner вместо регулярного выражения:

import Foundation

extension String {

    func byOffsettingNumbersBy(_ offset: Int) -> String {
        let scanner = Scanner(string: self)

        var output = ""

        while !scanner.isAtEnd {
            if let text = scanner.scanCharacters(from: CharacterSet.decimalDigits.inverted) {
                output += text
            } else if let int = scanner.scanInt() {
                output += String(int + offset)
            }
        }

        return output
    }

}

let strings = ["AA1BB2CC5H7", "AA1234BB2CC5H73A"]

let result = strings.map { $0.byOffsettingNumbersBy(1) }

print(result)

// Prints => ["AA2BB3CC6H8", "AA1235BB3CC6H74A"]

и, конечно, в его более простой форме, что-то вроде это можно использовать:

let result = "A12B40".byOffsettingNumbersBy(-5)

Подробнее о Scanner, NSHipster есть отличная статья по этому вопросу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...