2011-07-21 62 views
31

Tôi có chức năng sau được viết bằng Go. Ý tưởng là hàm có một chuỗi được truyền cho nó và trả về địa chỉ IP IPv4 đầu tiên được tìm thấy. Nếu không tìm thấy địa chỉ IP, một chuỗi rỗng sẽ được trả về.Lỗi "Trình tự thoát không xác định" trong Go

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

Các lỗi biên dịch thời gian tôi nhận được là

biết dãy thoát.

Tôi làm cách nào để biết rằng '.' là ký tự thực mà tôi đang tìm? Tôi nghĩ rằng thoát nó sẽ làm các trick, nhưng dường như tôi sai.

Trả lời

63

Dấu gạch chéo ngược \ không được giải thích bởi trình phân tích cú pháp regex, nó được diễn giải bằng chuỗi ký tự. Bạn nên thoát khỏi dấu chéo ngược lại:

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

Một chuỗi trích dẫn với " ký tự ngoặc kép được biết đến như một "chuỗi giải thích theo nghĩa đen" tại Gò. Các chuỗi ký tự chuỗi được giải thích giống như các chuỗi ký tự trong hầu hết các ngôn ngữ: \ các ký tự gạch chéo không được bao gồm theo nghĩa đen, chúng được sử dụng để tạo ý nghĩa đặc biệt cho ký tự tiếp theo. Nguồn phải bao gồm \\ hai dấu gạch chéo ngược liên tiếp để có được một ký tự dấu gạch chéo ngược duy nhất trong giá trị được phân tích cú pháp.

Evan Shaw pointed out in the comments, Go có một giải pháp thay thế khác có thể hữu ích khi viết chuỗi ký tự cho cụm từ thông dụng. Một "chuỗi chữ nguyên" được trích dẫn bởi ` ký tự gạch chéo. Hiện tại không có ký tự đặc biệt trong một chuỗi nguyên nghĩa đen, vì vậy miễn là mô hình của bạn không bao gồm backtick bạn có thể sử dụng cú pháp này mà không cần thoát ra bất cứ điều gì:

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

này được mô tả trong the "String literals" section of the Go spec.

+1

Rất cám ơn và thời gian tuyệt vời! – Nate

+24

Hoặc, bạn có thể sử dụng chuỗi không giải thích để tránh các dấu gạch chéo ngược kép: 'regexp.Compile (\' [0-9] + \. [0-9] + \. [0-9] + \. [0-9 ] + \ ')' –

+2

@Evan, mẹo tuyệt vời. Học một ngôn ngữ mới ... – Nate

1

địa chỉ IPv4 (chụp chính xác)

Matches 0.0.0.0 qua 255.255.255.255

Sử dụng regex này để phù hợp với số IP với accurracy.

Mỗi trong số 4 số được lưu trữ trong nhóm chụp, do đó bạn có thể truy cập chúng để xử lý tiếp.

"(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

Regex triệt để. Cảm ơn. – Nate

+1

Xem xét sự phức tạp của regex tôi có lẽ sẽ chọn để chuyển đổi chuỗi thành số nguyên và kiểm tra theo cách đó để thay thế. Một năm kể từ bây giờ tôi nghi ngờ tôi sẽ nhớ chi tiết của biểu hiện đó rất tốt. Đó là loại mã đã cắn tôi trước đây. Go thư viện thậm chí có thể có hỗ trợ cho loại kiểm tra ... Bây giờ tôi chỉ sử dụng dựa vào chuỗi gửi từ máy chủ được chính xác miễn là nó là 4 byte cách nhau bởi dấu chấm ("."). – Nate

+0

Để dễ đọc hơn, tôi thường làm: 'numBlock =" (25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9]? [0-9]) " regexPattern = numBlock +" \\ ". + numBlock + "\\". + numBlock + "\\". + numBlock ' – Nashenas

Các vấn đề liên quan