ios - 在 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
有没有更好的方法来做到这一点?
解决方案
这可能不是一种非常有效(或迅速:))的方式,但它可以完成工作。它的作用是搜索给定的 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)}")
}
}