Почему это регулярное выражение не совпадает? - PullRequest
0 голосов
/ 17 декабря 2018
my $genlog_line_1= qr{
   \A
   (?:(\d{6}\s+\d{1,2}:\d\d:\d\d|\d{4}-\d{1,2}-\d{1,2}T\d\d:\d\d:\d\d\.\d+(?:Z|-?\d\d:\d\d)?))? # Timestamp
   \s+
   (?:\s*(\d+))                     # Thread ID
   \s
   (\w+)                            # Command
   \s+
   (.*)                             # Argument
   \Z
}xs;

my $line = "2018-12-14T17:32:52.236100+08:00        477637459 Query SELECT dv.mandatory,dv.optional FROM dbversion dv";

my ($ts, $thread_id, $cmd, $arg) = $line =~ m/$genlog_line_1/;

print $ts, $thread_id, $cmd, $arg;

Почему регулярное выражение не совпадает?То, что я ожидаю, это:

Timestamp 2018-12-14T17:32:52.236100
thread_id 477637459 
cmd Query 
arg  SELECT dv.mandatory,dv.optional FROM dbversion dv

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

У вас есть +08:00 на входе, но -? в (?:Z|-?\d\d:\d\d)? учитывает только отрицательное значение или значения без знака.

Таким образом, в первой строке регулярных выражений вы должны заменить -? на [+-]?, чтобы соответствовать необязательному - или +.Кроме того, поскольку деталь +08:00 не должна входить в группу 1, я предлагаю использовать группу сброса ветвей , (?|...|...), чтобы объединить разные детали внутри группы в одну группу, группа 1:

(?|(\d{6}\s+\d{1,2}:\d\d:\d\d)|(\d{4}-\d{1,2}-\d{1,2}T\d\d:\d\d:\d\d\.\d+)(?:Z|[-+]?\d\d:\d\d)?)?
 ^^^                         ^ ^                                         ^     ^^^^         

Фиксированный шаблон:

my $genlog_line_1= qr{
   \A
   (?|(\d{6}\s+\d{1,2}:\d\d:\d\d)|(\d{4}-\d{1,2}-\d{1,2}T\d\d:\d\d:\d\d\.\d+)(?:Z|[-+]?\d\d:\d\d)?)? # Timestamp
   \s+
   (?:\s*(\d+))                     # Thread ID
   \s
   (\w+)                            # Command
   \s+
   (.*)                             # Argument
   \Z
}xs;

См. regex demo .

Обратите внимание на ? после того, как группа сброса скобок может не понадобитьсяесли TIMESTAMP всегда присутствует на входе.

0 голосов
/ 17 декабря 2018

Основная проблема вашего регулярного выражения заключается в том, что он не учитывает +08:00, присутствующий в вашем $line.

Измените его на:

\A(?:(\d{6}\s+\d{1,2}:\d\d:\d\d|\d{4}-\d{1,2}-\d{1,2}T\d\d:\d\d:\d\d\.\d+(?:Z|-?\d\d:\d\d)?))?(?:\+\d\d:\d\d)?\s+(?:\s*(\d+))\s+(\w+)\s+(.*)\Z

демо:

https://regex101.com/r/fgRCv1/3

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