首页 > 解决方案 > 通过字符串枚举以查找整数,更改然后替换它们 - Swift

问题描述

我有一个包含数字的字符串。字符串的长度可能不同,数字的数量和数字也可能在不同的地方。

我编写了一些代码来查找一个数字,将其加一,然后将其放回原始字符串中的相同位置。EG AA1BB 变为 AA2BB。我是 swift 新手,所以不完全确定我的代码是实现这一目标的最有效方法,但它确实有效。

但是,如果我有一个像 AA1BB2CC5H7 这样的字符串,你怎么能在每个数字上加一个,所以结果会是 AA2BB3CC6H8?我在猜测某种循环,最好使用正则表达式。

到目前为止,我只对字符串中的第一个数字起作用的代码是:

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)
}

任何有关解决此问题的最佳方法的建议或建议都会令人惊叹。谢谢!

标签: swiftstring

解决方案


虽然评论中提到的答案非常好,但让我通过使用我们的老朋友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)

有关更多信息ScannerNSHipster 对此有一篇很棒的文章


推荐阅读