使用 Nifi replaceText 将 char/string 的第一次或最后一次出现与另一个字符串交换?

Use Nifi replaceText to swap first or last occurance of char/string with another string?

正在尝试将标签添加到传入的 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")}"\,
Replacement Strategy: Regex Replace
Evaluation Mode: Entire Text

但结果不是预期的那样。低于:

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

正则表达式从来都不好... :( 有人可以帮助搜索和替换正确的短语吗?此外,如果有人可以解释正则表达式以及如何进行分组,那也会有所帮助。也许是一个很好的备忘单参考. 什么是测试和解析 nifi 特定正则表达式的好网站?

解决方案: 如果它可以帮助任何人找到该模式:搜索值:^(.*?)[{(将进行惰性搜索,直到找到第一个“[{”并将其之前的内容分组为 $1),因此替换为:$1{"nifi_received_ts_est":"${现在():格式("yyyy-MM-dd HH:mm:ss.SS")}",

我不确定你为什么要在这里使用正则表达式。正确的方法是将 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;

search value 更改为 ^(\[\{)(.*)

在这种情况下,第一组 (\[\{) 将匹配前两个符号

和第二组(.*)字符串的其余部分