web-dev-qa-db-ja.com

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

私が得ているコンパイル時エラーは

不明なエスケープシーケンス:。

Goに'.'は私が探している実際のキャラクターですか?逃げるとうまくいくと思ったが、どうやら間違っているようだ。

53
Nate

\バックスラッシュは正規表現パーサーでは解釈されず、文字列リテラルで解釈されます。バックスラッシュをもう一度エスケープする必要があります。

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

"二重引用符で囲まれた文字列は、Goでは「解釈された文字列リテラル」として知られています。解釈された文字列リテラルは、ほとんどの言語の文字列リテラルのようなものです。\バックスラッシュ文字は文字通り含まれず、次の文字に特別な意味を与えるために使用されます。ソースは、解析された値で単一のバックスラッシュ文字を取得するために、\\ 2つのバックスラッシュを連続して含める必要があります。

Goには、正規表現の文字列リテラルを記述するときに役立つ別の代替手段があります。「生の文字列リテラル」は、`バックティック文字で引用されます。生の文字列リテラルには特殊文字はありません。したがって、パターンにバックティックが含まれていない限り、何もエスケープせずにこの構文を使用できます。

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

これらは Go仕様の「文字列リテラル」セクション で説明されています。

108
Jeremy Banks

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