Разделите строку на три части с помощью регулярных выражений - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть строка: «Пользователь john.hughes вошел в систему с 192.168.82.245»

Как разделить его на две части с помощью регулярных выражений: «Пользователь вошел в систему с 192.168.82.245», «john. hughes "?

Я пробовал это (я использую perl):

$message =~ /(\w+) (.+) (.+)/;
my($user,$msg) = ($2,"$1 $3");

Но это не работает, и $ user equals" aleksandr.fetisov вошел в систему с ", вместо этого из "aleksandr.fetisov"

Проблема в том, что моя строка также может быть равна "Пользователь john.hughes вошел в систему", и в этом случае user и msg должны быть равны "Пользователь вошел в систему", "john.hughes "

1 Ответ

0 голосов
/ 30 апреля 2020

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

my $str = "User john.hughes logged in from 127.0.0.1";
$str =~ s/(?<=User\s)(\S+)\s//;
print "$1, $str";

В нем используется более продвинутая функция регулярного выражения, называемая положительный взгляд позади . По существу, должен быть шаблон User (с пробелом, который я представлял пробелом \s, поскольку его легче читать, чем случайный пробел в вашем паттерне), прежде чем что-либо будет сопоставлено. У имени пользователя нет пробелов, поэтому мы можем захватить как можно больше пробельных символов \S+ после этого. И за ним следует пробел.

Затем мы заменяем это ничем. Хорошая вещь о lookbehind - то, что это не часть шаблона, который будет заменен. Таким образом, результатом подстановки будет то, что имя пользователя и непосредственно следующий за ним пробельный символ будут удалены из строки. Поскольку существует одна группа захвата (), имя пользователя будет go в $1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...