如何仅在 golang 中的引号之外拆分字符?

How to split on a character only if it's outside of quotes in golang?

我需要在 + 符号上拆分一段文本,但前提是它在单引号之外。文本将类似于:

Some.data:'some+value'+some.more.data:9+yet.more.data:'rock+roll'

这应该成为三个值的切片:

我已经 found similar questions that do it using regex,但这需要 golang 正则表达式引擎没有的前瞻性。

我还尝试了创建自己的不带前瞻性的正则表达式:

'.*?'(\+)|[^']*(\+)

但这似乎在第三项上分崩离析,它在 'rock+roll' 中的 + 上分裂。

我考虑过可能对 + 进行字符串拆分,然后验证每个切片以确保它不是部分表达式,如果是,则将这些部分拼接回去,但它会相当涉及其中,我想尽可能避免它。

目前我认为最好的解决方案是识别引号内的文本(我 可以 使用正则表达式轻松完成),或者 URL 编码该文本或用加号做其他事情,拆分文本,然后 URL 解码表达式以获得引号内的 + 符号,但我想知道是否有更好的方法。

有谁知道使用正则表达式 不使用 来拆分引号外的 + 标志的方法吗?谁能想到比我的 URL encoding/decoding 方法更简单的解决方案?

纯代码可以更简单:

func split(s string) []string {
    var result []string
    inquote := false
    i := 0
    for j, c := range s {
        if c == '\'' {
            inquote = !inquote
        } else if c == '+' && !inquote {
            result = append(result, s[i:j])
            i = j +1
        }
    }
    return append(result, s[i:])
}