**已关闭。**此问题为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
2条答案
按热度按时间gopyfrb31#
这是关于转义 * 在go代码中的字符串中的字符 *,而不是 * 在regexp模式中的特殊字符 *。
使用
"
双引号版本,并对模式中的"
进行转义。https://go.dev/play/p/5jl2APxm-nf
人们通常使用原始字符串(反勾括起的字符串)作为regexp模式的原因正是因为
\
被处理为常规字符,而\
在regexp中有意义:https://go.dev/play/p/XVp0tQ0_BDv
然而,一个限制是没有办法在原始字符串中转义反引号。
您可以通过单独连接反引号来描述您的模式:
fzsnzjdm2#
这个答案是基于对另一个答案的评论中包含的重要信息:
每个表达式都通过以下方式在模板中定义:
{{ range $i := . }}{{ range $k, $v := . }} r = regexp.MustCompile({{$v}}) patterns["{{$k}}"] = r {{end}}{{end}}
修复方法是在模板输出中生成Go文字字符串时使用
%q
动词。此动词根据需要发出带有Go转义序列的双引号Go字符串文字。为了更好地衡量,这个模板片段也使用
%q
作为键。