Go正则表达式与字节模式[关闭]

szqfcxe2  于 2023-04-27  发布在  Go
关注(0)|答案(2)|浏览(80)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由一个错字或一个无法再复制的问题引起的。虽然类似的问题可能是on-topic在这里,但这个问题的解决方式不太可能帮助未来的读者。
30分钟前关闭
Improve this question
我在两个不同的服务中使用一组正则表达式。为了避免两个服务中的模式重复或不一致,我想在我正在构建的Go服务中重用第一个服务中定义的模式。我的实现使用模板来定义新服务中的表达式。
在一组模式中,它们混合了反引号、单引号和双引号。这是一个例子:

(?i)foo.{0,50}("|'|`)?[a-zA-Z0-9=]{112}("|'|`)?

我希望能够在不修改模式的情况下直接移植表达式。

我的问题:我可以用字节而不是字符串来定义模式吗?也许有一个库或不同的方法我可以采取来实现上述目标。

此模式未使用反引号正确转义:

r = regexp.MustCompile(`(?i)foo.{0,50}("|'|`)?[a-zA-Z0-9=]{112}("|'|`)?`)
    patterns["foo-token"] = r

也没有引号:

r = regexp.MustCompile("(?i)foo.{0,50}("|'|`)?[a-zA-Z0-9=]{112}("|'|`)?")
    patterns["foo-token"] = r
gopyfrb3

gopyfrb31#

这是关于转义 * 在go代码中的字符串中的字符 *,而不是 * 在regexp模式中的特殊字符 *。
使用"双引号版本,并对模式中的"进行转义。

func main() {
    pattern := "(?i)foo.{0,50}(\"|'|`)?[a-zA-Z0-9=]{112}(\"|'|`)?"

    fmt.Printf("-- as you can see, no backslash there:\n%s\n", pattern)
}

https://go.dev/play/p/5jl2APxm-nf
人们通常使用原始字符串(反勾括起的字符串)作为regexp模式的原因正是因为\被处理为常规字符,而\在regexp中有意义:

fmt.Println("a\tb") // <- a string with a <tab> character
    fmt.Println(`a\tb`) // <- a string with a '\' followed by a 't'

    regexp.MustCompile(`\w+`)
    regexp.MustCompile("\\w+") // <- you need to escape the \ in a regular string

    re := regexp.MustCompile(`\bfoo`)    // <- match 'foo' after an ascii word boundary
    reBug := regexp.MustCompile("\bfoo") // <- woops ! not what you think ! <backspace> followed by 'foo'

https://go.dev/play/p/XVp0tQ0_BDv
然而,一个限制是没有办法在原始字符串中转义反引号。
您可以通过单独连接反引号来描述您的模式:

`(?i)foo.{0,50}("|'|` + "`" + `)?[a-zA-Z0-9=]{112}("|'|` + "`" + `)?`
fzsnzjdm

fzsnzjdm2#

这个答案是基于对另一个答案的评论中包含的重要信息:
每个表达式都通过以下方式在模板中定义:{{ range $i := . }}{{ range $k, $v := . }} r = regexp.MustCompile({{$v}}) patterns["{{$k}}"] = r {{end}}{{end}}
修复方法是在模板输出中生成Go文字字符串时使用%q动词。此动词根据需要发出带有Go转义序列的双引号Go字符串文字。

{{range $k, $v := . }} 
     patterns[{{printf "%q" $k}}] = regexp.MustCompile({{printf "%q" $v}}) 
{{end}}

为了更好地衡量,这个模板片段也使用%q作为键。

相关问题