1. ホーム
  2. regex

[解決済み] Go の "Unknown escape sequence" エラー

2023-05-25 08:20:42

質問

以下のような関数が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 に '.' が私が探している実際の文字であることをGoに伝えるにはどうしたらよいでしょうか? エスケープすればうまくいくと思ったのですが、どうやら間違っているようです。

どのように解決するのですか?

この \ バックスラッシュは正規表現パーサーによって解釈されるのではなく、文字列リテラルによって解釈されます。バックスラッシュを再度エスケープする必要があります。

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

で引用された文字列は " ダブルクオート文字で引用された文字列は " と呼ばれます。 と解釈されます。 文字列リテラル" として知られています。解釈された文字列リテラルは多くの言語での文字列リテラルと同じです。 \ バックスラッシュ文字は文字通りに含まれるわけではなく、次の文字に特別な意味を持たせるために使われます。ソースには \\ を2つ並べる必要があります。

Go には、正規表現のための文字列リテラルを書くときに便利な別の選択肢があります: " raw 文字列リテラル" が引用されます。 ` バックスティック文字で引用されます。生の文字列リテラルには特別な文字はありませんので、パターンにバックスティックが含まれていない限り、何もエスケープせずにこの構文を使用することができます。

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

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