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

6ioyuze2  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(81)

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

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

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

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

我有found similar questions that do it using regex,但这需要向前看,而golang正则表达式引擎没有。
我还尝试了在没有lookahead的情况下创建自己的正则表达式:

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

但这似乎在第三个项目上崩溃了,它在+上分裂成'rock+roll'
我曾经考虑过在+上做一个字符串拆分,然后验证每个切片以确保它不是一个部分表达式,然后如果是,将这些片段拼接回一起,但这将相当复杂,如果可能的话,我想避免它。
目前,我认为最好的解决方案是识别引号内的文本(我可以用正则表达式轻松地做到这一点),要么对该文本进行URL编码,要么对加号做其他事情,拆分文本,然后URL解码表达式以获得引号内的+符号,但我想知道是否有更好的方法。
有没有人知道如何使用regex * 在不带 * lookahead的情况下对引号外的+符号进行拆分?有人能想到比我的URL编码/解码方法更简单的解决方案吗?

kgqe7b3p

kgqe7b3p1#

简单的代码可能更容易:

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

flvlnr442#

这个问题有点老了,但您可以考虑使用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的作者

相关问题