swift - 通过字符串枚举以查找整数,更改然后替换它们 - 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)
}
任何有关解决此问题的最佳方法的建议或建议都会令人惊叹。谢谢!
解决方案
虽然评论中提到的答案非常好,但让我通过使用我们的老朋友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 对此有一篇很棒的文章
推荐阅读
- r - 创建整洁的多个reduce函数
- windows - 错误:fetch-pack 的 waitpid 失败:没有子进程——任何永久解决方案
- php - 从数据库中读取并显示内容
- bash - TeamCity - 测试一些端点并处理结果。坚持处理结果,如何将其从 TC 发送到可视化
- python - 由于 gcc 错误,无法使用 pip 安装 sasl
- windows - 有没有办法从 Windows SDK 上的红外传感器获取无人机的高度?
- mysql - mysql查询连接两个表以查找未出现在右表上的元素
- reactjs - Express 或 react 正在删除标题
- jquery - 在 Google Chat 中创建新话题 - 如何发送新的指定话题密钥?
- javascript - 我如何在reactjs中更新获取请求