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

问题描述 投票:47回答:2

我在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,'.'是我正在寻找的实际角色?我认为逃避它会做到这一点,但显然我错了。

regex syntax go
2个回答
108
投票

\反斜杠不是由正则表达式解析器解释的,它是在字符串文字中解释的。你应该再次逃避反斜杠:

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中描述。


0
投票

IPv4地址(准确捕获)

匹配0.0.0.0到255.255.255.255

使用此正则表达式可以准确匹配UP数字。

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])"
© www.soinside.com 2019 - 2024. All rights reserved.