Подтвердить что ты не робот

Ошибка "Неизвестная escape-последовательность" в Go

У меня есть следующая функция, написанная в Go. Идея заключается в том, что функция имеет переданную ей строку и возвращает первый IP-адрес IPv4. Если 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)
}

Ошибка компиляции, которую я получаю,

неизвестная escape-последовательность:.

Как я могу сказать Go, что '.' является фактическим персонажем, который я ищу? Я думал, что сбежать от него будет трюк, но, видимо, я ошибаюсь.

4b9b3361

Ответ 1

\ Backslash не интерпретируется анализатором регулярных выражений, он интерпретируется в строковом литерале. Вы должны снова избежать обратной косой черты:

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

Строка, заключенная в " двойные кавычки", в Go называется "интерпретируемым строковым литералом". Интерпретируемые строковые литералы похожи на строковые литералы в большинстве языков: символы \ backslash не включаются буквально, они используются для придания особого значения следующий символ. Источник должен включать \\ две обратных косых черты в строке, чтобы получить один символ обратной косой черты в проанализированном значении.

Go имеет другую альтернативу, которая может быть полезна при написании строковых литералов регулярных выражений: "сырой строка" цитирует ' кавычкой символов. В необработанном строковом литерале нет специальных символов, поэтому, если в вашем шаблоне нет обратной черты, вы можете использовать этот синтаксис, не экранируя ничего:

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

Они описаны в разделе "Строковые литералы" спецификации Go.

Ответ 2

Адрес IPv4 (точный захват)

Соответствует 0.0.0.0 по 255.255.255.255

Используйте это регулярное выражение для соответствия IP-номерам с точностью.

Каждый из четырех номеров сохраняется в группе захвата, поэтому вы можете получить к ним доступ для дальнейшей обработки.

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