首页 > 解决方案 > 在 Swift 中将 %1$s 等占位符转换为 {x}

问题描述

我正在解析一个 XML 文档(使用XMLParser),其中一些值具有类似 php 的占位符,例如%1$s,我想将它们转换为{x-1}.

例子:

%1$s ---> {0}

%2$s ---> {1}

我使用正则表达式以一种看似 hacky 的方式执行此操作:

但是这个正则表达式必须有更好的实现。

考虑一个字符串:

let str = "lala fawesfgeksgjesk 3rf3f %1$s rk32mrk3mfa %2$s fafafczcxz %3$s czcz $#$#@%#@ %4$s qqq %5$s"

现在我们将提取字符串%$s之间的整数字符串:

let regex = try! NSRegularExpression(pattern: "(?<=%)[^$s]+")

let range = NSRange(location: 0, length: str.utf16.count)

let matches = regex.matches(in: str, options: [], range: range)
matches.map {
    print(String(str[Range($0.range, in: str)!]))
}

工作得很好。问题是“4”值因为%4$s之前的随机字符串而混淆了。

印刷:

1
2
3
#@ %4
5

有没有更好的方法来做到这一点?

标签: iosswift

解决方案


这可能不是一种非常有效(或迅速:))的方式,但它可以完成工作。它的作用是搜索给定的 reg ex 并使用匹配的子字符串来提取数值并减少它,然后在子字符串和新构造的占位符值之间执行简单的替换。这将在循环中执行,直到找不到更多匹配项。

let pattern = #"%(\d*)\$s"#

while let range = str.range(of: pattern, options: .regularExpression) {
    let placeholder = str[range]
    let number = placeholder.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)

    if let value = Int(number) {
        str = str.replacingOccurrences(of: placeholder, with: "{\(value - 1)}")
    }
}

推荐阅读