如何修正Go语言中单引号对转双引号对的字符串处理函数
解决Go语言字符串引号转换问题
问题背景
需要实现一个Go函数,完成以下转换:
- 将字符串中成对的单引号替换为成对双引号
- 将原单引号内部的双引号替换为单引号
- 保留字符串其他所有内容不变
输入示例:
'Get-Date -Format "yyyy-MM-dd HH:mm:ss"'
期望输出:
"Get-Date -Format 'yyyy-MM-dd HH:mm:ss'"
当前实现输出为 ''"Get-Date -Format 'yyyy-MM-dd HH:mm:ss'",存在两个问题:开头包含多余单引号,引号转换逻辑不符合预期。
现有代码问题分析
- 开启单引号区段时,错误执行
result.WriteString(input[:startIndex]),由于第一个字符就是单引号,input[:0]是空字符串,但后续闭合时的处理又重复写入内容,导致开头出现多余引号 - 遍历过程中对单引号内的双引号做了单独替换,同时闭合单引号时又对整个区段内容做替换,造成重复处理
- 单引号内的非引号字符未被写入结果,属于逻辑漏洞
修改后的完整代码
package main import ( "strings" "fmt" ) func transformQuotes(input string) string { var result strings.Builder inSingleQuote := false var innerContent strings.Builder for _, r := range input { switch r { case '\'': if inSingleQuote { // 闭合单引号区段:替换内部双引号为单引号,包裹双引号 result.WriteString(`"`) result.WriteString(strings.ReplaceAll(innerContent.String(), `"`, `'`)) result.WriteString(`"`) innerContent.Reset() inSingleQuote = false } else { // 开启单引号区段,开始收集内部内容 inSingleQuote = true } case '"': if inSingleQuote { // 单引号内的双引号先暂存,后续统一替换 innerContent.WriteRune(r) } else { // 单引号外的双引号直接保留 result.WriteRune(r) } default: if inSingleQuote { // 单引号内的普通字符暂存 innerContent.WriteRune(r) } else { // 单引号外的普通字符直接写入结果 result.WriteRune(r) } } } // 处理未闭合的单引号:直接保留原内容 if inSingleQuote { result.WriteString(`'`) result.WriteString(innerContent.String()) } return result.String() } func main() { input := `'Get-Date -Format "yyyy-MM-dd HH:mm:ss"'` fmt.Println(transformQuotes(input)) }
关键修改说明
- 单引号区段处理逻辑重构:使用单独的
innerContent收集单引号内的内容,避免遍历过程中重复写入结果,闭合时统一替换并包裹双引号 - 移除错误的前缀写入:删除开启单引号时写入
input[:startIndex]的代码,避免多余空字符串或重复内容 - 统一内部引号替换时机:将单引号内双引号的替换逻辑移至闭合区段时统一处理,避免遍历中的重复操作
- 完善字符写入逻辑:确保单引号内的所有字符(包括普通字符和双引号)都被正确暂存,单引号外的字符直接写入结果
- 修复未闭合单引号的处理:未闭合的单引号直接保留原格式,避免多余符号
内容的提问来源于stack exchange,提问作者Dr_Denzy
相关产品推荐
相关产品推荐

