如何用单引号转义字符串
How to escape a string with single quotes
我正在尝试取消引用 Go 中使用单引号的字符串(语法与 Go 字符串文字语法相同,但使用单引号而不是双引号):
'\'"Hello,\nworld!\r\n\u1F60ANice to meet you!\nFirst Name\tJohn\nLast Name\tDoe\n'
应该变成
'"Hello,
world!
Nice to meet you!
First Name John
Last Name Doe
我该如何完成?
strconv.Unquote
不适用于 \n
换行符 (https://github.com/golang/go/issues/15893 and https://golang.org/pkg/strconv/#Unquote),并且简单地 strings.ReplaceAll(
ing 将很难支持所有 Unicode 代码点和其他反斜杠像 \n
& \r
& \t
.
这样的代码
我可能要求太多了,但如果它自动验证 Unicode 就好了,就像 strconv.Unquote
可能 do/is 做的那样(它知道 x Unicode 代码点可能成为一个角色),因为我可以用 unicode/utf8.ValidString
.
做同样的事情
@CeriseLimón 想出了这个答案,我只是把它放到一个有更多恶作剧的函数中来支持 \n
s。首先,这会交换 '
和 "
,并将 \n
s 更改为实际的换行符。然后它 strconv.Unquote
每行,因为 strconv.Unquote
无法处理换行,然后重新交换 '
和 "
并将它们拼凑在一起。
func unquote(s string) string {
replaced := strings.NewReplacer(
`'`,
`"`,
`"`,
`'`,
`\n`,
"\n",
).Replace(s[1:len(s)-1])
unquoted := ""
for _, line := range strings.Split(replaced, "\n") {
tmp, err := strconv.Unquote(`"` + line + `"`)
repr.Println(line, tmp, err)
if err != nil {
return nil, NewInvalidAST(obj.In.Text.LexerInfo, "*Obj.In.Text.Text")
}
unquoted += tmp + "\n"
}
return strings.NewReplacer(
`"`,
`'`,
`'`,
`"`,
).Replace(unquoted[:len(unquoted)-1])
}
我正在尝试取消引用 Go 中使用单引号的字符串(语法与 Go 字符串文字语法相同,但使用单引号而不是双引号):
'\'"Hello,\nworld!\r\n\u1F60ANice to meet you!\nFirst Name\tJohn\nLast Name\tDoe\n'
应该变成
'"Hello,
world!
Nice to meet you!
First Name John
Last Name Doe
我该如何完成?
strconv.Unquote
不适用于 \n
换行符 (https://github.com/golang/go/issues/15893 and https://golang.org/pkg/strconv/#Unquote),并且简单地 strings.ReplaceAll(
ing 将很难支持所有 Unicode 代码点和其他反斜杠像 \n
& \r
& \t
.
我可能要求太多了,但如果它自动验证 Unicode 就好了,就像 strconv.Unquote
可能 do/is 做的那样(它知道 x Unicode 代码点可能成为一个角色),因为我可以用 unicode/utf8.ValidString
.
@CeriseLimón 想出了这个答案,我只是把它放到一个有更多恶作剧的函数中来支持 \n
s。首先,这会交换 '
和 "
,并将 \n
s 更改为实际的换行符。然后它 strconv.Unquote
每行,因为 strconv.Unquote
无法处理换行,然后重新交换 '
和 "
并将它们拼凑在一起。
func unquote(s string) string {
replaced := strings.NewReplacer(
`'`,
`"`,
`"`,
`'`,
`\n`,
"\n",
).Replace(s[1:len(s)-1])
unquoted := ""
for _, line := range strings.Split(replaced, "\n") {
tmp, err := strconv.Unquote(`"` + line + `"`)
repr.Println(line, tmp, err)
if err != nil {
return nil, NewInvalidAST(obj.In.Text.LexerInfo, "*Obj.In.Text.Text")
}
unquoted += tmp + "\n"
}
return strings.NewReplacer(
`"`,
`'`,
`'`,
`"`,
).Replace(unquoted[:len(unquoted)-1])
}