Go regexp:匹配三个星号

ale*_*nco 4 go

所以我这样做了:

r, _ := regexp.Compile("* * *")
r2 := r.ReplaceAll(b, []byte("<hr>"))
Run Code Online (Sandbox Code Playgroud)

并得到:

panic: runtime error: invalid memory address or nil pointer dereference
Run Code Online (Sandbox Code Playgroud)

所以我想我必须逃避他们:

r, _ := regexp.Compile("\* \* \*")
Run Code Online (Sandbox Code Playgroud)

但是得到了 unknown escape secuence

我是围棋初学者。我究竟做错了什么?

nem*_*emo 5

您不是在检查错误。

regexp.Compile 给你两个结果:

  1. 编译后的模式(或nil
  2. 编译模式时的错误(或nil

您正在忽略错误并访问nil结果。观察(在玩):

r, err := regexp.Compile("* * *")

fmt.Println("r:", r)
fmt.Println("err:", err)
Run Code Online (Sandbox Code Playgroud)

运行此代码将告诉您,确实存在错误。错误是:

解析正则表达式时出错:缺少重复运算符的参数: *

所以是的,你是对的,你必须逃避重复运算符*。您尝试了以下操作:

r, err := regexp.Compile("\* \* \*")
Run Code Online (Sandbox Code Playgroud)

因此,您从编译器收到以下错误:

未知的转义序列:*

由于有许多类似的转义序列\n\r特殊字符,你没有你的键盘上,但想在字符串,编译器试图插入这些字符。\*不是有效的转义序列,因此编译器无法进行替换。您想要做的是转义转义序列,以便正则表达式解析器可以完成它的工作。

所以,正确的代码是:

r, err := regexp.Compile("\\* \\* \\*")
Run Code Online (Sandbox Code Playgroud)

处理这些怪癖的最简单方法是使用原始字符串文字(“``”)而不是普通引号:

r, err := regexp.Compile(`\* \* \*`)
Run Code Online (Sandbox Code Playgroud)

这些原始字符串完全忽略转义序列。