Apache Nifi 表达式语言:查找与正则表达式匹配的部分内容

问题描述 投票:0回答:1

任务是找到表达式中与所选正则表达式匹配的部分,并将该部分放入新字段的值中。

例如“描述”字段中的表达式:

“纬度是12324.24”

我需要从中提取“12324.24”值,并使用 UpdateRecord 处理器创建新字段:

“纬度 = 12324.24”

我正在寻找 matchesRegex。例如:

 /description[matchesRegex(., '(\d+)(\.)(\d+)')]

但它只检查整个表达式是否与正则表达式匹配。例如,当“description”仅包含“12324.24”时,matchesRegex 工作正常,但该字段不仅包含纬度值。

一个重要通知: 字段值不一定像我上面显示的那样。所以它可能包括:

“12324.24 是纬度”, “12324.24这个值”, “12324.24 是 12234 的纬度”, 和其他可能的值。唯一的要求是包含纬度值(所示情况下为 12324.24)。

因此,基于文本中标记的位置(或值)的 substring、substringAfter、substringBefore 和类似方法不适合我的任务。

regex apache-nifi
1个回答
0
投票

您正在使用“过滤器”,如文档中的“记录路径指南”中所述。

你的表情

/description[matchesRegex(., '(\d+)(\.)(\d+)')]
的意思是:

  • 占领田野
    description
  • if 字段值(由 . 引用)
  • 匹配提供的正则表达式

如果字段的值与查询不匹配,则表达式不会解析为任何字段(及其值),而是解析为

null
。 顺便说一句,您可以将此类过滤表达式同时应用于多个字段,例如想象
description
是一个包含多个值的数组,您的过滤器只能保留匹配的数组项。

您希望使用“独立函数”来转换原始输入,而不是过滤值。 以下表达式

replaceRegex(/description, '.*?(\d+.\d+).*', '$1')

  • 检索字段
    description
  • 匹配反对提供的正则表达式,并且
  • 替换所有匹配es提供的替换

替换又可以通过索引 (

$1
) 或名称
${groupName}
来引用捕获组。

使用的

UpdateRecord
的完整配置包含:

{
  "/latitude": "replaceRegex(/description, '.*?(\\d+.\\d+).*', '$1')",
  "Record Writer": "d79fc7b7-872c-3fd0-8a2a-cf4ff21bfa2e",
  "Record Reader": "44045758-d88e-3c93-ae9f-2173c7860a26",
  "Replacement Value Strategy": "record-path-value"
}
© www.soinside.com 2019 - 2024. All rights reserved.