web-dev-qa-db-fra.com

Erreur "séquence d'échappement inconnue" dans Go

J'ai la fonction suivante écrite en Go. L'idée est que la fonction a une chaîne qui lui est transmise et renvoie la première adresse IP IPv4 trouvée. Si aucune adresse IP n'est trouvée, une chaîne vide est renvoyée.

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

L'erreur de compilation que j'obtiens est

séquence d'échappement inconnue:.

Comment puis-je dire à Go que le '.' est le personnage que je recherche? Je pensais que l'évasion ferait l'affaire, mais apparemment je me trompe.

53
Nate

Le \ la barre oblique inverse n'est pas interprétée par l'analyseur rationnel, elle est interprétée dans le littéral de chaîne. Vous devriez de nouveau échapper à la barre oblique inverse:

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

Une chaîne entre guillemets " les guillemets doubles sont appelés "littéraux de chaîne interprétés" dans Go. Les littéraux de chaîne interprétés sont comme des littéraux de chaîne dans la plupart des langues: \ les barres obliques inverses ne sont pas incluses littéralement, elles sont utilisées pour donner une signification particulière au caractère suivant. La source doit inclure \\ deux barres obliques inverses consécutives pour obtenir un seul caractère barre oblique inverse dans la valeur analysée.

Go a une autre alternative qui peut être utile lors de l'écriture de littéraux de chaîne pour des expressions régulières: un "littéral de chaîne brut" est cité par ` caractères de backtick. Il n'y a pas de caractères spéciaux dans un littéral de chaîne brut, donc tant que votre modèle n'inclut pas de backtick, vous pouvez utiliser cette syntaxe sans rien échapper:

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

Ceux-ci sont décrits dans la section "Littéraux de chaîne" de la spécification Go .

108
Jeremy Banks

Adresse IPv4 (capture précise)

Correspond à 0.0.0.0 à 255.255.255.255

Utilisez cette expression régulière pour faire correspondre les numéros IP avec précision.

Chacun des 4 numéros est stocké dans un groupe de capture, vous pouvez donc y accéder pour un traitement ultérieur.

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