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

Regex 使用Nifi replaceText将字符/字符串的第一次或最后一次出现与另一个字符串交换?,regex,apache-nifi,hortonworks-data-platform,Regex,Apache Nifi,Hortonworks Data Platform,正在尝试向传入的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":"81

正在尝试向传入的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"}]
在regexp中从来都不好…:(有人能帮我搜索和替换正确的短语吗?还有,如果有人能解释regexp以及如何进行分组,这也会有帮助。也许是一个很好的备忘表参考。什么是测试和解析nifi特定regexp表达式的好网站

解决方案:
如果它有助于任何人找到模式:搜索值:^(.*)[{(将执行延迟搜索,直到找到第一个'[{'并将之前的内容分组到$1),那么替换将是:$1{“nifi_received_ts_est”:“${now():format(“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;

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

搜索值更改为
^(\[\{)(.*)

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


第二组
(.*)
字符串的其余部分将
搜索值更改为
^(\[\{)(.*)

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


第二组
(.*)
字符串的其余部分需要添加nifi\u时间戳,以便尝试使用现有的replaceText处理器。@StrangerThinks:那么为什么这个问题要用“Perl”标记?抱歉。nifi似乎使用Java正则表达式而不是perl。我错误地将其标记为perlNeed以添加nifi_时间戳,因此试图使用现有的replaceText处理器。@奇怪的是:那么为什么这个问题用“perl”标记?抱歉。nifi似乎使用Java正则表达式而不是perl。我错误地将其标记为perlthanks…这是有效的,但我需要确保搜索是惰性的,并且只替换第一次出现的。相反,对于“}”'最后一次发生。我如何强制执行此操作?当
评估模式:全文
时,
搜索值开头的
^
表示全文的开头-所以只有一次。我正在考虑这样一个事实,即传入的消息在^和
之间可能有空格'[{。但我想这种方法应该可以。我可以知道是否有任何方法可以根据具体情况替换操作吗?例如:如果发现第一个出现的'[{'替换为'ABC',如果发现第一个出现的'{'replace为'XYZ'。是否可以使用单个replaceText处理器执行此操作?如果它对任何人都有帮助,请找到模式:搜索值:^(.*)[{(将执行延迟搜索,直到找到第一个'[{'并将之前的内容分组到$1),因此替换将是:$1{“nifi_received_ts_est:“${now():format(“yyyy-MM-dd HH:MM:ss.ss”)}”,谢谢…它正在工作,但我需要确保搜索是惰性的,并且它只替换第一个出现的。反之,'}]'最后一次发生。我如何强制执行此操作?当
评估模式:全文
时,
搜索值开头的
^
表示全文的开头-所以只有一次。我正在考虑这样一个事实,即传入的消息在^和
之间可能有空格'[{。但我想这种方法应该可以。我可以知道是否有任何方法可以根据具体情况替换操作吗?例如:如果发现第一个出现的'[{'替换为'ABC',如果发现第一个出现的'{'replace为'XYZ'。是否可以使用单个replaceText处理器进行此操作?如果它对任何人都有帮助,请找到模式:搜索值:^(.*)[{(将执行延迟搜索,直到找到第一个'[{'并将之前的内容分组到$1),因此替换将是:$1{“nifi_received_ts_est:“${now():format(“yyyy-MM-dd HH:MM:ss.ss”),