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



我需要在+符号上分割一大块文本,但仅当它在单引号之外时。文本看起来像:

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

应该变成三个值的切片:

  • Some.data:"一些+价值">
  • some.more.data: 9
  • +
  • yet.more.data:"摇滚">

我发现类似的问题使用regex,但这需要向前看,golang regex引擎没有。

我还试着创建了自己的regex,没有向前看:

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

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

我想过可能在+上做字符串分割,然后验证每个切片,以确保它不是部分表达式,然后将碎片拼接在一起,如果是的话,但它将相当涉及,我想避免它,如果可能的话。

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

有没有人知道一种方法来分割+标志,即使用regex而不使用向前看?有人能想到一个比我的URL编码/解码方法更简单的解决方案吗?

普通代码可以更容易:

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:])
}

这个问题有点老了,不过你可以考虑使用go-andiamo/splitter

的例子:

package main
import (
"github.com/go-andiamo/splitter"
)
func main() {
plusSplitter := splitter.MustCreateSplitter('+', splitter.SingleQuotes)
s := "Some.data:'some+value'+some.more.data:9+yet.more.data:'rock+roll'"
if parts, err := plusSplitter.Split(s); err == nil {
for _, part := range parts {
println(part)
}
} else {
println(err.Error())
}
}

try on go-playground

披露:我是go-andiamo/splitter的作者

最新更新