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


71

我用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'.'我正在寻找的实际角色?我以为转义可以解决问题,但显然我错了。


这是一个古老的问题,但是每天人们都会对正则表达式产生疑问。使用正则表达式时(不管使用哪种语言),要做的一件非常非常有用的事情是打印正则表达式模式以验证它是否确实如您所想。
阿图尔

这个问题也是相关的普罗米修斯(promql正则表达式)
亚历克·伊斯托明

Answers:


142

\反斜杠没有被正则表达式解析器解释,它被解释的字符串常量。您应该再次转义反斜杠:

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

"双引号引起来的字符串在Go中被称为“解释字符串文字”。解释的字符串文字与大多数语言中的字符串文字相似:\反斜杠字符不按字面意义包含,它们用于为下一个字符赋予特殊含义。源必须\\连续包含两个反斜杠,才能在解析的值中获得单个反斜杠字符。

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

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

这些在Go规范的“字符串文字”部分中进行了描述。


这让我发疯!谢谢!
安德鲁·霍恩

1

IPv4地址(准确捕获)

匹配0.0.0.0到255.255.255.255

使用此正则表达式将IP编号与准确性匹配。

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])"

尼斯彻底正则表达式。谢谢。
Nate

1
考虑到正则表达式的复杂性,我可能会选择将字符串转换为整数,然后采用这种方式进行检查。从现在开始的一年,我怀疑我会很好地记住该表达的细节。那种代码以前已经咬过我了。Go库甚至可能支持这种检查...现在,我只是依靠从服务器发送的字符串是正确的,只要它是由点(“。”)分隔的4个字节即可。
内特-

为了使阅读更容易,我通常会这样做: numBlock="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" regexPattern=numBlock + "\\." + numBlock + "\\." + numBlock + "\\." + numBlock
Nashenas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.