You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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'",存在两个问题:开头包含多余单引号,引号转换逻辑不符合预期。

现有代码问题分析

  1. 开启单引号区段时,错误执行result.WriteString(input[:startIndex]),由于第一个字符就是单引号,input[:0]是空字符串,但后续闭合时的处理又重复写入内容,导致开头出现多余引号
  2. 遍历过程中对单引号内的双引号做了单独替换,同时闭合单引号时又对整个区段内容做替换,造成重复处理
  3. 单引号内的非引号字符未被写入结果,属于逻辑漏洞

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:37:16