2011-07-21 34 views
31

私は次の機能をGoに書いています。アイデアは、関数に文字列が渡され、見つかった最初のIPv4 IPアドレスを返します。 IPアドレスが見つからない場合は、空の文字列が返されます。Goで "Unknown escape sequence"エラーが発生しました

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には、'.'が実際のキャラクターであることをどのように伝えることができますか?私はそれをエスケープすることがトリックを行うと思ったが、明らかに私は間違っている。

答えて

63

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

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

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

Evan Shaw pointed out in the commentsとして、Goには正規表現の文字列リテラルを書くときに便利な別の方法があります。 「生の文字列リテラル」は、`のバックティック文字によって引用されます。生の文字列リテラルには特殊文字は、その限り、あなたのパターンは、あなたが何をエスケープせずに、この構文を使用することができますバッククォートが含まれていないとして、ありません:

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

これはthe "String literals" section of the Go specに記載されています。

+1

多くのありがとう、素晴らしいタイミング! – Nate

+24

また、二重バックスラッシュを避けるために、未解釈の文字列を使用することもできます: 'regexp.Compile(\' [0-9] + \。[0-9] + \。[0-9] + \。[0-9 ] + \ ')' –

+2

@エヴァン、素晴らしいヒント。新しい言語を学ぶ... – Nate

1

IPv4アドレス(正確なキャプチャ)

マッチ255.255.255.255

通じ0.0.0.0

accurracyと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

ニース徹底した正規表現。ありがとう。 – Nate

+1

正規表現の複雑さを考えると、おそらく文字列を整数に変換してその代わりにチェックすることを選択します。 1年後、私はその表現の詳細をよく覚えているだろうかと疑う。その種のコードは以前私に噛まれています。ライブラリは、この種のチェックをサポートすることさえあるかもしれません...今は、ドット( "。")で区切られた4バイトである限り、サーバから送信された文字列に頼っているだけです。 – Nate

+0

これを読みやすくするために、私は通常次のようにします: 'numBlock ="(25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9]?[0-9]) " regexPattern = numBlock +" \\。 " + numBlock + "\\" + numBlock + "\\" + numBlock ' – Nashenas

関連する問題