所以我这样做了:
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
我是围棋初学者。我究竟做错了什么?
您不是在检查错误。
regexp.Compile
给你两个结果:
nil
)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)
这些原始字符串完全忽略转义序列。
归档时间: |
|
查看次数: |
3796 次 |
最近记录: |