Ich habe die folgende Funktion in Go geschrieben. Die Idee ist, dass der Funktion eine Zeichenfolge übergeben wird und die erste gefundene IPv4-IP-Adresse zurückgegeben wird. Wird keine IP-Adresse gefunden, wird eine leere Zeichenfolge zurückgegeben.
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)
}
Der Fehler beim Kompilieren ist
unbekannte Fluchtfolge :.
Wie kann ich Go sagen, dass dies '.'
der eigentliche Charakter ist, den ich suche? Ich dachte, es würde den Trick machen, aber anscheinend irre ich mich.
Antworten:
Der
\
Backslash wird nicht vom Regex-Parser interpretiert, sondern im String-Literal. Sie sollten dem Backslash erneut entkommen:regexp.Compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")
Eine Zeichenfolge mit
"
doppelten Anführungszeichen wird in Go als " interpretiertes Zeichenfolgenliteral" bezeichnet. Interpretierte String-Literale sind in den meisten Sprachen wie String-Literale:\
Backslash-Zeichen sind nicht wörtlich enthalten, sondern werden verwendet, um dem nächsten Zeichen eine besondere Bedeutung zu geben. Die Quelle muss\\
zwei Backslashes hintereinander enthalten, um ein einzelnes Backslash-Zeichen im analysierten Wert zu erhalten.Go hat eine andere Alternative, die beim Schreiben von String-Literalen für reguläre Ausdrücke nützlich sein kann: Ein " Raw- String-Literal" wird durch
`
Backtick-Zeichen zitiert . Es gibt keine Sonderzeichen in einem rohen String-Literal. Solange Ihr Muster keinen Backtick enthält, können Sie diese Syntax verwenden, ohne sich irgendetwas zu entziehen:regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`)
Diese werden im Abschnitt "String-Literale" der Go-Spezifikation beschrieben .
quelle
IPv4-Adresse (genaue Erfassung)
Entspricht 0.0.0.0 bis 255.255.255.255
Verwenden Sie diesen regulären Ausdruck, um IP-Nummern genau abzugleichen.
Jede der 4 Nummern wird in einer Erfassungsgruppe gespeichert, sodass Sie zur weiteren Verarbeitung darauf zugreifen können.
"(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])"
quelle
numBlock="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" regexPattern=numBlock + "\\." + numBlock + "\\." + numBlock + "\\." + numBlock