Регулярное выражение на основе наличия атрибута и его значения - PullRequest
2 голосов
/ 05 мая 2020

У меня вопрос по регулярному выражению, вот мой текст:

1 200 file:test01.txt, action:read, User:dummy
2 201 file:test01.txt, action:write, User:dummy
3 202 file:unknown, keepalive , User:dummy
4 450 file:test01.txt, action:read, User:dummy
5 500 file:test01.txt, action:read, User:dummy
6 201 profiles, action:reload, User:dummy

Я бы хотел обработать все строки, где:

  1. Второй столбец находится в 20 [ 012]
  2. действие не читается
  3. действие отсутствует

Так я бы сопоставил:

2 201 file:test01.txt, action:write, User:dummy
3 202 file:unknown, keepalive , User:dummy
6 201 profiles, action:reload, User:dummy

Ищу способ получить строку, где: действие отличается от чтения и где действие не появляется

Я пробовал разными способами безуспешно, вот моя последняя неудача, первая строка выживает ...

^\d+\s+(?<code>(20[012])).*(action:(?<!read))?

https://regex101.com/r/HGESxR/1

Есть подсказки?

Спасибо, Марчелло

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете использовать

^\d+\s+(?<code>20[0-2])\s(?:.*action:(?!read)(?<action>\w+)|(?!.*action)).*

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • \d+ - 1+ цифр
  • \s+ - 1+ пробелов
  • (?<code>20[0-2]) - «Код» группы: 20 и затем 0, 1 или 2
  • \s - пробел
  • (?:.*action:(?!read)(?<action>\w+)|(?!.*action)) - группа без захвата соответствует либо
    • .*action:(?!read)(?<action>\w+) - 0+ символов, кроме символов разрыва строки, как можно больше, action: подстрока, затем Групповое «действие», захватывающее любые символы из 1+ слов, но не начинающееся с read последовательность символов
    • | - или
    • (?!.*action) - сразу вправо, не должно быть action после любых 0+ символов, кроме символов разрыва строки, как можно больше
  • .* - 0+ символов, кроме символов разрыва строки, как можно больше
0 голосов
/ 05 мая 2020

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

^(?!.*action:read\b)\d\s+20[012]\s

Demo

Механизм регулярных выражений (PCRE) выполняет следующие операции .

^                     match beginning of line
(?!                   begin negative lookahead
  .*action:read\b     match 0+ chars except newline followed by
                      'action:read' followed by a word break
)                     end negative lookahead
\d\s+20               match a digit, 1+ spaces, '20'
[012]                 match '0', '1' or '2'
\s                    match a space

Если вы хотите сопоставить всю строку, которая соответствует двум требованиям (а не просто определить, выполняются ли требования), добавьте .* в конец регулярного выражения. Demo

Поскольку отрицательный просмотр вперед, закрепленный в начале строки, не потребляет никаких символов, внутренний указатель движка находится в начале строки при сопоставлении \d.

...