Пятничный вечерний разбор.Кто уже пьет пиво 🍻, для того скорее субботний или еще какой, более поздний вариант.
Регулярка была длинная, но что поделать, практический пример, IP как никак часто встречаются
Ответов правильных немного, да и вообще, скажем честно, ответов мало. Видно было лень разбираться в этих длинных регулярках
Все равно расскажу, вдруг все ж есть интересующиеся.1️⃣ Вариант не рабочий, по
явно видной причине. Маска для цифр - \d{3}
Этим мы указываем, что ожидаем цифры - это \d и именно 3 подряд, это - {3}
А у нас в ip адресе, сегменты могут иметь от 1 до 3 символов, например 3-ий разряд только 1 цифра или 2 в нашем примере (
192.168.1.14 например)
Так что мимо ✈️
3️⃣ Почти верный, за исключением маленькой детали
Вот так начинается группа, отвечающая за ip -
(\d{1,3}\...Выглядит все верно, ожидаем от 1 до 3 цифр подряд, пока не будет точка.
Так как правила отрабатывают по очереди, то мы остановимся уже на одной цифре, а их 3 -> 192
В итоге мы вырежем не
192.168.1.14, а
2.168.1.14, т.е 19 проигнорируем
Это происходит из-за того, что перед группой стоит .*, т.е любая последовательность символов, а потом хотя бы 1 цифра до точки, вот поэтому 19 отойдут к части шаблона .*
А вот во 2️⃣ варианте у нас перед группой появился пробельный символ
\s. И там отработает, так как ожидаем любую последовательность, потом
пробел(а это как раз перед началом ip) а потом от 1 до 3 цифр до точки. И в том случае все встает на свои места (т.е еще раз, так как ожидаем пробел именно перед цифрами, то 19 уже не сможет попасть в часть .*, так как она идет после пробела, и она пойдет в часть \d{1,3})
4️⃣ Вариант
Первый набор групп будет немного непредсказуемым
('Suser003', '2025-03-06 10:20:23 INFO Suser001 logged in from 192.168.1.14')
т.е первая группа вроде отработала правильно, хотя при ближайшем рассмотрении мы видим, что туда попало имя пользователя из ненужной строки. Вторая группа, вместо ожидаемого ip адреса "хапнула" в разы больше.
Почему так?\s означает не только пробел, а также переносы строк
В итоге мы ловим (S\w+) -> Suser003
потом любая последовательность символов .*, которая должна закончиться пробельным символом
\sПод это подходит все до конца второй строки, и так как это не входит в группу, мы это не должны возвращать, а только учитывать при поиске соответствия шаблону
Потом идет описание нашей группы(\d.*\.1\..*)
А это 1 цифра, потом .* любое количество символов пока не будет точка \.
потом 1, потом опять точка\ \., а потом любая последовательность
\s уже стоит за пределом группы, т.е после 1 мы ожидаем все что угодно, пока не будет пробельный символ
Т.е первая цифра - это 2(первый символ 3-ей строки), потом любое количество символов до точка 1 точка и опять любое количество до пробела или переноса строки
Если вы посмотрите на 3 строку, то она вся попадает под этот шаблон. От двойки, до 3-го сегмента ip адреса .1. и остатка Ip адреса до первого \s
Второй набор будет корректный, лишь потому, что у нас больше нет строк. Если бы были, мы бы так же захватили всю следующую строку, если бы там тоже был ip адрес, где 3-ий сегмент 1
Вот такая задача.Познавательно - 👍
Непонятно, задавайте вопросы