Go中的"未知转义序列"错误

Nat*_*ate 55 regex syntax go

我在Go中编写了以下函数.想法是函数有一个传递给它的字符串并返回找到的第一个IPv4 IP地址.如果未找到IP地址,则返回空字符串.

func parseIp(checkIpBody string) string {
    reg, err := regexp.Compile("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+")
    if err == nil {
        return ""
    }   
    return reg.FindString(checkIpBody)
}
Run Code Online (Sandbox Code Playgroud)

我得到的编译时错误是

未知逃脱序列:.

我怎么能告诉Go这'.'是我正在寻找的实际角色?我认为逃避它会做到这一点,但显然我错了.

小智 112

\反斜杠没有被正则表达式解析器解释,它被解释的字符串字面英寸 你应该再次逃避反斜杠:

regexp.Compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")
Run Code Online (Sandbox Code Playgroud)

引用"双引号字符的字符串在Go中称为"解释字符串文字".在大多数语言中,解释的字符串文字就像字符串文字:\字面上不包括反斜杠字符,它们用于为下一个字符赋予特殊含义.源必须\\在一行中包含两个反斜杠,以在解析的值中获得单个反斜杠字符.

正如Evan Shaw在评论中指出的那样,Go还有另一种选择,在为正则表达式编写字符串文字时非常有用."原始字符串文字"由`反引号字符引用.原始字符串文字中没有特殊字符,因此只要您的模式不包含反引号,您就可以使用此语法而不转义任何内容:

regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`)
Run Code Online (Sandbox Code Playgroud)

Go规范的"字符串文字"部分对此进行了描述.