regex - Go 中的 "Unknown escape sequence"错误

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

我得到的编译时错误是

unknown escape sequence: .

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

最佳答案

\ 反斜杠没有被正则表达式解析器解释,而是在字符串文字中解释。您应该再次转义反斜杠:

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

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

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

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

这些在 the "String literals" section of the Go spec 中有描述.

关于regex - Go 中的 "Unknown escape sequence"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770898/

相关文章:

database - 如何使用 docker-compose 运行 golang-migrate?

ruby-on-rails - 如何从 Rails 中的字符串中识别一组日期

正则表达式需要匹配 p 标签中的任何内容

go - 使用反射和动态类型附加去朗片

vue.js - 当我从浏览器输入路由时,带有 VueJS 前端的 Go-Chi 文件服务器示例后端出现错误 404 Not Found

c++ - C++ 是上下文无关的还是上下文敏感的?

jquery - 验证不带 www 的 url。或 http ://

mysql - 如何在 MySQL 中查找共享相同(未知)前缀的字符串组?

c++ - 这个使用 boost::mismatch 的例子是什么意思?

C# 和 MySQL - 语法不正确?