Я думаю, что соответствующие части стандарта C99 составляют 6.5. Выражения, §2
. Между предыдущей и следующей точкой последовательности объект должен иметь неизменяемое значение хранимого значения не более одного раза за счет оценки выражение. Кроме того, предыдущее значение должно считываться только для определения сохраняемого значения.
blockquote>и 6.5.16 Операторы присваивания, §4:
Порядок оценки операндов не определена. Если делается попытка изменить результат оператора присваивания или получить к нему доступ после следующей точки последовательности, поведение не определено.
blockquote>
Конец обратной косой черты \
не интерпретируется парсером regex, он интерпретируется в строковом литерале. Вы должны снова избежать обратной косой черты:
regexp.Compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+")
Строка, цитируемая с символами двойной буквы "
, известна как «интерпретируемый строковый литерал» в Go. Интерпретированные строковые литералы похожи на строковые литералы на большинстве языков: \
символы обратной косой черты не включены буквально, они используются, чтобы придавать особое значение следующему символу. Источник должен включать \\
две обратные косые черты в строке, чтобы получить один символ обратной косой черты в анализируемом значении.
Поскольку Эван Шоу указал в комментариях , Go имеет другое альтернативу, которая может быть полезна при написании строковых литералов для регулярных выражений. «Необработанный строковый литерал» цитируется символами обратного вызова `
. В строковом литерале нет специальных символов, поэтому, если ваш шаблон не включает обратную ссылку, вы можете использовать этот синтаксис, не избегая ничего:
regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`)
Это описано в «Строковые литералы» раздела спецификации Go .
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])"