Ошибка «Неизвестная escape-последовательность» в Go - PullRequest
53 голосов
/ 21 июля 2011

У меня есть следующая функция, написанная на 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, что '.' - это именно тот персонаж, которого я ищу? Я думал, что сбежать от этого получится, но, видимо, я ошибаюсь.

Ответы [ 2 ]

108 голосов
/ 21 июля 2011

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

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

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

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

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

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

0 голосов
/ 21 июля 2011

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])"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...