gpt4 book ai didi

regex - Golang替换不在引号之间的所有空格

转载 作者:行者123 更新时间:2023-12-01 22:34:52 26 4
gpt4 key购买 nike

我读过this引号,内容涉及替换引号之间的所有空白,但我最近开始使用golang,这表示golang不支持perl类型的regex。有没有办法使用正则表达式替换golang中的所有空格。

如果有办法用正则表达式专门做到这一点,我将不胜感激。

例子:

A B " C" -> AB" C"
A B ' C' -> AB' C'
A B ` C` -> AB` C`

A B \'C\' -> AB\'C\'
A B '\` C \`' -> AB'\` C \`'
A B "\' C C \"\'\"" -> AB"\' C C \"\'\""

最佳答案

替换所有不在引号之间的空格。

例子:

A B " C" -> AB" C"
A B ' C' -> AB' C'
A B ` C` -> AB` C`

A B \'C\' -> AB\'C\'
A B '\` C \`' -> AB'\` C \`'
A B "\' C C \"\'\"" -> AB"\' C C \"\'\""


代码必须正确,并且要正确,代码必须可读。到目前为止,还没有提供正确或可读的正则表达式解决方案。

在Go中解析文本。

例如,
package main

import (
"fmt"
"unicode"
)

// Remove all whitespace not between matching unescaped quotes.
func removeUnquotedSpace(s string) (string, error) {
rs := make([]rune, 0, len(s))
const out = rune(0)
var quote rune = out
var escape = false
for _, r := range s {
if !escape {
if r == '`' || r == '"' || r == '\'' {
if quote == out {
// start unescaped quote
quote = r
} else if quote == r {
// end (matching) unescaped quote
quote = out
}
}
}
// backslash (\) is the escape character
// except when it is the second backslash of a pair
escape = !escape && r == '\\'
if quote != out || !unicode.IsSpace(r) {
// between matching unescaped quotes
// or not whitespace
rs = append(rs, r)
}
}
if quote != out {
err := fmt.Errorf("unmatched unescaped quote: %q", quote)
return "", err
}
return string(rs), nil
}

func main() {
tests := []struct {
in, out string
}{
{`A B " C"`, `AB" C"`},
{"A B ' C'", "AB' C'"},
{"A B ` C`", "AB` C`"},
{`A B \'C\'`, `AB\'C\'`},
{"A B '\\` C \\`'", "AB'\\` C \\`'"},
{`A B "\' C C \"\'\""`, `AB"\' C C \"\'\""`},

{`A B " C \\"`, `AB" C \\"`},
}
for _, tt := range tests {
out, err := removeUnquotedSpace(tt.in)
fmt.Printf(
"|| %v || %v || %v || %v\n",
tt.in, out, out == tt.out, err,
)
}
}

游乐场: https://play.golang.org/p/-3cDwSaakIb

输出:
|| A B " C" || AB" C" || true || <nil>
|| A B ' C' || AB' C' || true || <nil>
|| A B ` C` || AB` C` || true || <nil>
|| A B \'C\' || AB\'C\' || true || <nil>
|| A B '\` C \`' || AB'\` C \`' || true || <nil>
|| A B "\' C C \"\'\"" || AB"\' C C \"\'\"" || true || <nil>
|| A B " C \\" || AB" C \\" || true || <nil>

关于regex - Golang替换不在引号之间的所有空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59849887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com