Error de “secuencia de escape desconocida” en Go

Tengo la siguiente función escrita en Ir. La idea es que la función tenga una cadena que se le pase y devuelve la primera dirección IP IPv4 encontrada. Si no se encuentra una dirección IP, se devuelve una cadena vacía.

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

El error en tiempo de comstackción que obtengo es

secuencia de escape desconocida:.

¿Cómo puedo decirle a Go que el '.' es el personaje real que estoy buscando? Pensé que escapar sería suficiente, pero aparentemente estoy equivocado.

La \ backslash no está siendo interpretada por el analizador de expresiones regulares, se está interpretando en el literal de cadena. Debería escapar de la barra inversa de nuevo:

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

Una cadena citada con " comillas dobles " se conoce como “literal de cadena interpretada” en Go. Los literales de cadena interpretados son como literales de cadena en la mayoría de los lenguajes: \ caracteres de barra invertida no se incluyen literalmente, se usan para dar un significado especial a el siguiente carácter. La fuente debe incluir \\ dos barras diagonales inversas en una fila para obtener una sola barra invertida en el valor analizado.

Como Evan Shaw señaló en los comentarios , Go tiene otra alternativa que puede ser útil al escribir literales de cadenas para expresiones regulares. Un “literal de cadena sin formato” es citado por ` caracteres invertidos. No hay caracteres especiales en un literal de cadena sin procesar, por lo que siempre que su patrón no incluya un backtick puede usar esta syntax sin escapar de nada:

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

Esto se describe en la sección “Literales de cadenas” de la especificación Go .

Dirección IPv4 (captura precisa)

Coincide con 0.0.0.0 a 255.255.255.255

Use esta expresión regular para hacer coincidir los números de IP con la precisión.

Cada uno de los 4 números se almacena en un grupo de captura, por lo que puede acceder a ellos para su posterior procesamiento.

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