Регулярное выражение для соответствия ключевым словам и переменным stati c - PullRequest
1 голос
/ 09 января 2020

Я ищу более краткий способ захвата ключевых слов из строки, используя Perl разновидность регулярного выражения.

Пример строки:

QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem INTER in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

Мне нужно захватить ключевое слово (с косой чертой):

/QSECOFR/

И следующие потенциальные переменные после слова подсистема

INTER
QINTER
QINTER2
QCTL

У меня есть следующее регулярное выражение, но я смотрю для более компактного способа проверки этого:

/\/QSECOFR\/\w+\s\w+\s+\w+\s\d+\/\d+\/\d+\s\w+\s\d+:\d+:\d+\sin\ssubsystem\s(?:QINTER|QINTER2|INTER|QCTL)\sin\sQSYS/

Здесь все в порядке: https://regex101.com/r/eSyRVZ/1

Но было бы предпочтительнее что-то менее изощренное.

Спасибо!

Редактировать:

Чтобы прояснить ситуацию, я надеюсь, что регулярное выражение будет соответствовать любому из следующих:

 QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem INTER in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER2 in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QCTL in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

Ответы [ 2 ]

1 голос
/ 09 января 2020

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

Возможно, код должен выглядеть следующим образом шт

use strict;
use warnings;

use feature 'say';

while( <DATA> ) {
 say $1 if m!(/QSECOFR/.*?subsystem\s+(INTER|QINTER|QINTER2|QCTL).*?)\.!;
}

__DATA__
QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem INTER in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)
QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)
QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER2 in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)
QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QCTL in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)
QSECOFR Logins: (Information / 00) Job 874194/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem ACTL in QSYS. Job entered system on 09/01/20 at 14:06:13. (at 2020-01-09 14:06:13)

Выход

/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem INTER in QSYS
/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER in QSYS
/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QINTER2 in QSYS
/QSECOFR/ABC1E started on 09/01/20 at 14:06:13 in subsystem QCTL in QSYS
0 голосов
/ 10 января 2020

В конце концов, это сработало:

/.*\/QSECOFR\/.*(?:QINTER|QINTER2|ABCINTER|QSYS).*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...