Swift 使用正则表达式替换字符串中的组只替换最后一个组
我有一个字符串“[test1]AAAAAA[test2]BBBBB[test3]”,我正试图用另一个字符串Regex括在括号中的所有键Swift 使用正则表达式替换字符串中的组只替换最后一个组,swift,regex,swift5,Swift,Regex,Swift5,我有一个字符串“[test1]AAAAAA[test2]BBBBB[test3]”,我正试图用另一个字符串Regex括在括号中的所有键[test1] 所以我的结果是:“一AAAAA两BBBBB三” 但是,我的正则表达式只替换了最后一个键[test3] [test1]aaaaa[test2]BBBBB[THREE] 我做错了什么? 我知道括号仍然在我的输出中,我还没有找到我去掉它的部分 let testString=“[test1]AAAAAA[test2]BBBBB[test3]” 扩展字符串{
[test1]
所以我的结果是:“一AAAAA两BBBBB三”
但是,我的正则表达式只替换了最后一个键[test3]
[test1]aaaaa[test2]BBBBB[THREE]
我做错了什么?
我知道括号仍然在我的输出中,我还没有找到我去掉它的部分
let testString=“[test1]AAAAAA[test2]BBBBB[test3]”
扩展字符串{
func子字符串(from:Int,to:Int)->String{
让开始=索引(开始索引,偏移:起始)
让结束=索引(开始,偏移:到-从)
返回字符串(self[start..字符串{
返回子字符串(从:range.lowerBound到:range.upperBound)
}
}
let pattern=“\\[(.+?)\\]”
让regex=试试!NSRegularExpression(模式:模式)
func replaceElements(uuOriginal:String)->String{
var替换=原始
let range=NSRange(位置:0,长度:original.utf16.count)
enumerateMatches(in:original,options:[],range:range){(results,flags,stop)in
guard let results=results else{return}
让range1=results.range(at:1)
let key=original.substring(范围:range1)
如果let值=交换(键:键){
替换=原始。replacingOccurrences(of:key,with:value)
}
}
换回
}
func交换(键:字符串)->字符串{
如果键==“test1”{
返回“一”
}
如果键==“test2”{
返回“2”
}
如果键==“test3”{
返回“三”
}
归零
}
打印(替换元素(测试字符串))
这是个小错误。不分配“处理过的”字符串,而是继续使用当前替换项重新分配原始字符串:
// Instead of replaced = original.replacing...
replaced = replaced.replacingOccurrences(of: key, with: value)
话虽如此,您可以用最小的方法实现完全相同的结果,并完全避免正则表达式和范围。大概是这样的:
let testString = "[test1] AAAAAA [test2] BBBBB [test3]"
let keyMap = [
"[test1]" : "ONE",
"[test2]" : "TWO",
"[test3]" : "THREE",
]
var output = testString
for (key, value) in keyMap {
output = output.replacingOccurrences(of: key, with: value)
}
print(output)
呼气黑尔深深地谢谢你!我刚刚注意到您的更新答案,以及您的解决方案,对于我的实现来说,这要容易得多。不过,RegEx版本可能会帮助其他人!使用
replacement=replacement.replacingOccurrences(of:original.substring(range:results.range(at:0)),with:value)
let testString = "[test1] AAAAAA [test2] BBBBB [test3]"
let keyMap = [
"[test1]" : "ONE",
"[test2]" : "TWO",
"[test3]" : "THREE",
]
var output = testString
for (key, value) in keyMap {
output = output.replacingOccurrences(of: key, with: value)
}
print(output)