Соответствует строке после третьего двоеточия и до четвертого двоеточия. Если только 1 двоеточие, соответствует вся строка (Regex)

Это довольно сложное регулярное выражение (может быть, для меня), поэтому, надеюсь, мое объяснение будет ясным.

Характеристики:

  • Первое двоеточие после квадратной скобки

    [1234]: ‹- Это первое двоеточие

  • Сопоставление строки после третьего двоеточия и до четвертого двоеточия

    [1234]: abc : 0 : xyz : ‹- будет соответствовать xyz, потому что это после 3-го двоеточия и до 4-го двоеточия

  • И если у него нет другого двоеточия после 1-го, он будет соответствовать всей строке после 1-го двоеточия после квадратной скобки [1234]: abc def ghi ‹- Он будет соответствовать всей строке abc def ghi после 1-го двоеточия, поскольку это не так. т есть еще двоеточие.

Несколько примеров ниже:

xxxx[2114]: отладка: 0: ABC::CheckIdleTimeout(): слот=2 0x00000000 RC_OK

Должен соответствовать только ABC

xxxx[13312]: информация: 0: логин пользователя: admin: xx.xxx.xx.xx/123

Должен соответствовать только логин пользователя

xxxx[12898]: pam_unix(sshd:session): сеанс открыт для администратора пользователя

Должен соответствовать сессии, открытой только для пользователя-администратора.

xxxx[12898]: Принятый пароль для администратора от порта xx.xxx.xx.xx 123

Должна соответствовать всей строке после двоеточия Принятый пароль для администратора от xx.xxx.xx.xx порт 123

======

То, что у меня есть сейчас, вероятно, не поможет, но, возможно, это может стать отправной точкой для вас.

\[(.*?)\]:\s(\w.*)

Соответствует только строке после [xxxx]:

Я использую рубиновое регулярное выражение.


person Salt    schedule 28.04.2017    source источник


Ответы (2)


Регулярное выражение немного сложное, потому что оно должно одновременно соответствовать совершенно разным случаям:

^.*?\[.*?\]:(?:[^:]*?:[^:]*?: *([^:]*?) *(?=$|:).*| *([^:]*?) *)$

Группы захвата: \1 и \2. Вы можете использовать их конкатенацию, потому что они взаимоисключающие. Посмотреть демо.

Здесь на rubular.

person horcrux    schedule 28.04.2017

Попробуйте это регулярное выражение:

^(?:[^:]+:){3}([^:]+?(?:$|:))|^(?:[^:]+:)([^:]+$)

Он возвращает нужные подстроки в первой и второй группах захвата. Доступ к этим группам зависит от используемого вами языка.

Демонстрация: https://regex101.com/r/6jWZlX/2

person Dmitry Egorov    schedule 28.04.2017
comment
Спасибо большое за вашу помощь! Удивительно! - person Salt; 28.04.2017