Go中的“未知转义序列”错误

时间:2011-07-21 03:16:28

标签: 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)
}

我得到的编译时错误是

  

未知的转义序列:。

我如何告诉Go '.'是我正在寻找的实际角色?我认为逃避它会成功,但显然我错了。

2 个答案:

答案 0 :(得分:100)

正则表达式解析器不解释\反斜杠,它在字符串文字中被解释。你应该再次反复使用反斜杠:

regexp.Compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")

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

Go有另一种替代方法,在为正则表达式编写字符串文字时非常有用:“原始字符串文字”由`反引号字符引用。原始字符串文字中没有特殊字符,因此只要您的模式不包含反引号,您就可以使用此语法而不转义任何内容:

regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`)

the "String literals" section of the Go spec中描述了这些内容。

答案 1 :(得分:0)

IPv4地址(准确捕获)

匹配0.0.0.0至255.255.255.255

使用此正则表达式将IP号码与accurracy匹配。

4个数字中的每一个都存储在一个捕获组中,因此您可以访问它们以进行进一步处理。

"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"