2016-03-04 4 views
0

У меня есть несколько квадратных скобок данных в файле журнала журнала splunk. Я пытаюсь найти определенное поле UserDataGuid и затем собирать данные в скобке после этого. Мой единственный вариант, похоже, является регулярным выражением в стандарте, который кажется мне похожим на perl. Но не работает, что я делаю неправильно здесь?Использование RegEx для захвата поля в скобках

| rex "\]\s(?<UserDataGuid>.*?)\s*$" 

    // this trial looks more promising but grabs the last bracket :(and doesn't name the field, to be used in a subSearch. 
    | rex "(?i)UserDataGuid\s*\[([^\}]*)\] 

данных выглядит следующим образом

[21] INFO UserDataGuid [fas08f0da-faf6-4308-aad6-hfld5643gs] [(null)] [(null)] [(null)] 

и я хочу только справ

fas08f0da-faf6-4308-aad6-hfld5643gs 

, и я хотел бы, чтобы это было поле, я мог бы повторно использовать как поля используются в Splunk.

+0

Почему вы написали это: '[^ \}] *'? –

ответ

1

Я хотел бы попробовать следующее регулярное выражение:

(?<=UserDataGuid \[).*?(?=\])/g 

Это захватит fas08f0da-faf6-4308-aad6-hfld5643gs. См. Демо here.

+1

Неправильно привыкнуть добавлять '/ gmis' до конца каждого шаблона, который вы пишете. В этом случае вы хотите найти только первое вхождение шаблона; у вас нет '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' вы хотите совместить 'UserDataGuid' -' userdataguid' не будет делать; и вас не интересуют строки, которые охватывают новые строки. Так что * ни один из этих модификаторов полезен – Borodin

+0

@ Бородин, да, я согласен с вами над флагами/gmis. Однако, основываясь на ограниченном знании входной строки, это может быть многострочный захват, поэтому, чтобы быть в безопасности, я добавил это, полагая, что OP знает, что делается и может корректироваться в зависимости от потребностей. Я не собираю '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Однако g (глобальный) требуется, поскольку OP может иметь гораздо больше захватов, чем один. – Saleem

1

С

\]\s(?<UserDataGuid>.*?)\s*$ 

вы говорите: соответствовать ]>\], следовать любым символом пробела (только один) >\s, следуют группой с именем UserDataGuid>(?<UserDataGuid> ...), который содержит любой символ, кроме новой строки (ноль раз, до неограниченного времени) >.*? (в ленивом режиме, ?), следовать любому символ пробела (ноль раз, чтобы неограниченное количество раз) >\s*, следует к концу строки >$

Я думаю, что вы не хотите этот (?<UserDataGuid> ...); вы хотите соответствовать (в некотором роде) UserDataGuid, нет вызова UserDataGuid в группе, которые соответствуют "любой символ, кроме символа новой строки (ноль раз, чтобы неограниченное количество раз) >.*? (в ленивый режим, ?) "

В

(?i)UserDataGuid\s*\[([^\}]*)\] 

Измените }, для ], а затем, вы захватили ваш GUID в группе # 1

, но вам не нужно матч "UserDataGuid \ s [*" вы можете использовать:

(?<=UserDataGuid \[)([^\]]*)

, а затем, вы только соответствовать GUID, и найти его в группе # 1 вы можете удалить скобку группы № 1, потому что это полный матч:

(?<=UserDataGuid \[)[^\]]*

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

1

похоже, что вы хотите

(?<=UserDataGuid\s\[)([^\]]*) 
Смежные вопросы