Использовать Nifi replaceText для замены первого или последнего появления символа / строки другой строкой?

Попытка добавить тег к входящему файлу потока nifi json.

Вход:

[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

Ожидаемый результат:

[{"nifi_received_ts_est":"2018-10-04 09:31:50.108","HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

Пробовал разные методы, и сейчас я близок к этому:

Search Value: ^([^\[]*)
Replacement Value: [{"nifi_received_ts_est":"${now():format("yyyy-MM-dd HH:mm:ss.SS")}"\,$2
Replacement Strategy: Regex Replace
Evaluation Mode: Entire Text

Но результат не такой, как ожидалось. попадая ниже:

[{"nifi_received_ts_est":"2018-10-04 09:31:50.108",$2[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

Никогда не был хорош в регулярном выражении ... :( Может ли кто-нибудь помочь с правильной фразой для поиска и замены? Также, если кто-то может объяснить регулярное выражение и то, как выполняется группировка, это тоже поможет. Возможно, хорошая справочная таблица. сайт для тестирования и анализа конкретных выражений регулярного выражения nifi?

РЕШЕНИЕ: Если это поможет кому-нибудь найти шаблон: Значение поиска: ^ (. *?) [{(Будет выполнять ленивый поиск, пока не найдет первый '[{' и группирует все до него в $ 1), поэтому замена будет: $ 1 {"nifi_received_ts_est ":" $ {now (): format ("гггг-ММ-дд ЧЧ: мм: сс.СС")} ",


person StrangerThinks    schedule 04.10.2018    source источник


Ответы (2)


измените search value на ^(\[\{)(.*)

в этом случае первая группа (\[\{) будет соответствовать первым двум символам

а вторая группа (.*) остальная часть строки

person daggett    schedule 04.10.2018
comment
спасибо ... он работает, но мне нужно убедиться, что поиск ленив и заменяет только первое вхождение. и наоборот для '}]' последнее происшествие. Как я могу добиться этого? - person StrangerThinks; 04.10.2018
comment
когда Evaluation Mode: Entire Text, то ^ в начале Search Value означает начало всего текста - так один раз. - person daggett; 04.10.2018
comment
Я считаю, что во входящем сообщении могут быть пустые места между ^ и '[{'. Но я думаю, этот подход должен подойти. Могу ли я узнать, есть ли способ заменить операцию в зависимости от конкретного случая? например: если найдено первое вхождение '[{', заменить на 'ABC', а если найдено первое вхождение '{' - заменить на 'XYZ'. Можно ли это сделать с одним процессором replaceText? - person StrangerThinks; 04.10.2018
comment
Если это кому-то поможет, нашла шаблон: Значение поиска: ^ (. *?) [{(Будет выполнять ленивый поиск, пока не найдет первый '[{', и сгруппирует данные перед ним в $ 1), поэтому замена будет: $ 1 {nifi_received_ts_est: $ {now (): format (yyyy-MM-dd HH: mm: ss.SS)}, - person StrangerThinks; 04.10.2018

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

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use JSON;
use Time::Piece;

my $json_parser = JSON->new;

my $json = '[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]';

my $data = $json_parser->decode($json);

$data->[0]->{nifi_received_ts_est} =
  localtime->strftime('%Y-%m-%d %H:%M:%S');

$json = $json_parser->encode($data);

say $json;
person Dave Cross    schedule 04.10.2018
comment
Необходимо добавить nifi_timestamp, чтобы попытаться использовать существующий процессор replaceText. - person StrangerThinks; 04.10.2018
comment
@StrangerThinks: Тогда почему этот вопрос помечен тегом Perl? - person Dave Cross; 04.10.2018
comment
извинения. Похоже, что nifi использует регулярные выражения Java вместо perl. Я по ошибке пометил это на perl - person StrangerThinks; 04.10.2018