Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用正则表达式替换字符串中的组只替换最后一个组_Swift_Regex_Swift5 - Fatal编程技术网

Swift 使用正则表达式替换字符串中的组只替换最后一个组

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]AAAAAA[test2]BBBBB[test3]”,我正试图用另一个字符串Regex括在括号中的所有键
[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)