如何仅在 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'
这应该成为三个值的切片:
- 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:])
}
我需要在 +
符号上拆分一段文本,但前提是它在单引号之外。文本将类似于:
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 正则表达式引擎没有的前瞻性。
我还尝试了创建自己的不带前瞻性的正则表达式:
'.*?'(\+)|[^']*(\+)
但这似乎在第三项上分崩离析,它在 '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:])
}