EL 表达式

引用

Apache NiFi Expression Language Guide

表达式函数

字符串

大小写转换

toUpper

描述

将小写转为大写

参数

返回值

转换后的大写字符串

案例

假设 流文件 存在一个属性 demo,其值为demoDEMO

表达式输出结果
${demo:toUpper()}DEMODEMO

toLower

描述

将大写转为小写

参数

返回值

转换后的小写字符串

案例

假设 流文件 存在一个属性 demo,其值为demoDEMO

表达式输出结果
${demo:toLower()}demodemo

去除字符串前后的空格

trim

描述

和Java中的trim功能一致,都是去除字符串前后的空格(不会去掉字符串中间的空格)

参数

返回值

去除前后空格后的字符串

案例

假设 流文件 存在一个属性 demo,其值为demo(前后各有一个空格)

表达式输出结果
${demo:trim()}demo

字符串截取

substring

描述

根据开始下标和结束下标截取字符串的一部分,必须提供开始下标,结束下标默认为字符串尾

参数
  1. 截取的起始下标
  2. 截取的结束下标
返回值

截取后的字符串内容

注意
  • 下标从**0**开始
  • 下标含头不含尾
  • 索引必须是数字,否则会报错
  • 开始下标必须小于结束下标,否则报错
  • 如果超长(指目标字符串过短)将返回空白字符串

假设 流文件 存在一个属性 demo,其值为demo123

案例
表达式输出结果
${demo:substring(0,1)}d
${demo:substring(0,4)}demo
${demo:substring(2)}mo123
${demo:substring(4)}123
${demo:substring(${demo:length():minus(3)})}123
案例解释
  1. 从第0个字符开始,到第1个字符,总共取1个字符(不包括第一个字符)
  2. 从第0个字符开始,到第4个字符,总共取4个字符(不包括第4个字符)
  3. 从第2个字符开始,到字符串最后(未提供结束下标)
  4. 从第4个字符开始,到字符串最后(未提供结束下标)
  5. 取字符串最后3个字符(首先获取到字符串长度,该长度减去要获取的长度即是需要截去的长度)

substringBefore/substringBeforeLast

描述

substringBefore:截取从首部开始,到指定字符结束的字符串(正序)

substringBeforeLast:截取从首部开始,到指定字符结束的字符串(倒序)

这两个参数非常类似,其都是从开始取值,到指定字符结束,如果找不到目标字符,都会返回字符串的所有内容;唯一的区别在于,substringBefore是从当前位置向后寻找字符,而substringBeforeLast刚好相反,它是从后向前寻找

参数
  1. 匹配查找的字符串
返回值

截取的内容

注意
  • 如果找不到指定的字符串,会将源字符串原样返回
  • substringBefore从头开始substringBeforeLast从尾开始
案例

假设 流文件 存在一个属性 demo,其值为demo123demo123

表达式结果
${demo:substringBefore('o1')}dem
${demo:substringBeforeLast('o1')}demo123dem
${demo:substringBefore('sss')}demo123demo123
${demo:substringBeforeLast('sss')}demo123demo123
案例解释
  1. 从头开始寻找o1 ,并返回从0下标开始,到o1字符串为止的中间字符
  2. 从尾开始寻找o1 ,并返回从0下标开始,到o1字符串为止的中间字符
  3. 从头开始寻找sss ,但源字符串不包括sss ,因此直接返回源字符串
  4. 从尾开始寻找sss ,但源字符串不包括sss ,因此直接返回源字符串

substringAfter/substringAfterLast

描述

substringAfter:截取从末尾开始,到指定字符结束的字符串(正序)

substringAfterLast:截取从末尾开始,到指定字符结束的字符串(倒序)

这两个函数非常类似,其都是从末尾取值,到指定字符结束,如果找不到目标字符,都会返回字符串的所有内容;唯一的区别在于,substringAfter是从当前位置向后寻找字符,而substringAfterLast刚好相反,它是从后向前寻找

参数
  1. 匹配查找的字符串
返回值

截取的内容

注意
  • 如果找不到指定的字符串,会将源字符串原样返回
  • substringAfter从头开始substringAfterLast从尾开始
  • 截取时不包含目标字符串
案例

假设 流文件 存在一个属性 demo,其值为demo123demo123

表达式结果
${demo:substringBefore('o1')}23demo123
${demo:substringBeforeLast('o1')}23
${demo:substringBefore('sss')}demo123demo123
${demo:substringBeforeLast('sss')}demo123demo123
案例解释
  1. 从头开始寻找o1 ,并返回从字符串结束下标开始,到o1字符串为止的中间字符
  2. 从尾开始寻找o1 ,并返回从字符串结束下标开始,到o1字符串为止的中间字符
  3. 从头开始寻找sss ,但源字符串不包括sss ,因此直接返回源字符串
  4. 从尾开始寻找sss ,但源字符串不包括sss ,因此直接返回源字符串

附加与追加

append/prepend

描述

append:在源字符串后追加字符串

prepend:在源字符串前附加字符串

append和prepend的区别在于,append是在源字符串后追加,prepend是在源字符串之前附加,> 使用时注意甄别它们之间的区别

参数
  1. 附加或追加的字符串
返回值

添加后的字符串

注意
  • 如果源字符串为空,无论那个函数都会返回其本身
案例

假设 流文件 存在一个属性 demo,其值为demo

表达式输出结果
${demo:append('123')}demo123
${demo:prepend('123')}123demo
案例解释
  1. 在字符串后附加
  2. 在字符串前附加

字符串替换

replace/replaceFirst

描述

replace:用另一个字符串替换源字符串中的所有目标字符串(文本替换)

replaceFirst:仅替换源字符串中第一次出现的目标字符串

参数
  1. 要匹配的字符串或正则表达式
  2. 目标字符串
返回值

替换后的字符串

注意
  • replaceFirst 函数仅替换一次
  • replace 函数会替换所有
案例

假设 流文件 存在一个属性 demo,其值为demo123demo123

表达式输出结果
${demo:replace('123', '456')}demo456demo456
${demo:replaceFirst('123', '456')}demo456demo123
案例解释
  1. 替换源字符串中所有的 123 为 456
  2. 仅替换源字符串中第一次出现的 123 替换为 456

字符串搜索

startsWith/endsWith

描述

startsWith:判断给定的参数是否是源字符串的开始

endsWith:判断给定的参数是否是源字符串的结束

参数
  1. 要进行比较的字符串
返回值

Boolean

注意

案例

假设 流文件 存在一个属性 demo,其值为demo123

表达式输出结果
${demo:startsWith('demo')}true
${demo:endsWith('123')}true
案例解释
  1. 判断源字符串是否以 demo 开始
  2. 判断源字符串是否以 123 结束

contains

描述

判断源字符串中是否包含给定的参数

参数
  1. 要进行比较的参数
返回值

Boolean

注意
  • 在字符串的任意位置匹配即认为符合
案例

假设 流文件 存在一个属性 demo,其值为demo123

表达式输出结果
${demo:contains('456')}false
${demo:contains('mo12')}true
案例解释
  1. 判断源字符串中是否包含 456
  2. 判断源字符串中是否包含 mo12

in

描述

判断源字符串是否包含在给定参数的字符串列表中

参数
  1. 进行比较的字符串列表
返回值

Boolean

注意

案例

假设 流文件 存在一个属性 demo,其值为demo

表达式输出结果
${demo:in('123', '456', 'aaa')}false
${demo:in('123', '456', 'demo')}true
案例解释
  1. 判断 demo 是否包含在 123、456、aaa
  2. 判断 demo 是否包含在 123、456、demo

find/matches

描述

根据给定的正则表达式,在源字符串中寻找匹配项

find:部分匹配即可

matches:必须和给定的参数完全一致

参数
  1. 正则表达式(表达式)
返回值

Boolean

注意
  • find要求部分匹配即可,matches必须完全匹配
  • 正则表达式的写法须符合java的规范
案例

假设 流文件 存在一个属性 demo,其值为demo123

表达式输出结果
${demo:find('[Dd]em[Oo]')}true
${demo:find('[Dd]em[Oo].*')}false
${demo:matches('[Dd]em[Oo]')}false
案例解释
  1. 在源字符串中寻找是否具有匹配的字符串(D、O允许大小写)
  2. 在源字符串中寻找是否具有匹配的字符串(D、O允许大小写,且具有.*后缀)
  3. 在源字符串中寻找是否具有匹配的字符串(D、O允许大小写),matches要求完全匹配,因此返回false

indexOf/lastIndexOf

描述

在源字符串中寻找给定参数的索引

indexOf:正序查找(从前向后)

lastIndexOf:倒序查找(从后向前)

参数
  1. 要寻找的字符串
返回值

Number

注意
  • 如果找不到给定的参数,将返回 -1
  • 索引从 0 开始计算
  • 如果有多个匹配项,将返回 第一次 找到的匹配项的索引
案例

假设 流文件 存在一个属性 demo,其值为demo123

表达式输出结果
${demo:indexOf('e')}1
${demo:lastIndexOf('e')}5
案例解释
  1. 在源字符串中 从前向后 查找字符  e
  2. 在源字符串中 从后向前 查找字符  e

字符串填充

padLeft/padRight

描述

padLeft:在左侧填充,直到符合长度

padRight:在右侧填充,直到符合长度

这两个函数都是根据提供的目标长度和填充字符串,对源字符串进行填充,区别是填充的位置不一样

参数
  1. 目标长度
  2. 填充字符串
返回值

填充完成后的字符串

注意

案例

假设 流文件 存在一个属性 demo,其值为demo

表达式输出结果
${demo:padLeft(10,'#')}######demo
${demo:padRight(10,'#')}demo######
案例解释
  1. 向左侧填充#,使字符串长度为10
  2. 向右侧填充#,使字符串长度为10

字符串判空操作

replaceNull/replaceEmpty

描述

replaceNull:如果字符串为空,返回参数

replaceEmpty:如果字符串为空或其中字符不可见(换行,回车,空格,制表符等),返回参数

参数
  1. 为空时要替代的字符串
返回值

替换结束后的字符串

注意

案例

假设 流文件 存在一个属性 demo1,其值为空

假设 流文件 存在一个属性 demo2,其值为(三个空格)

表达式输出结果
${demo1:replaceNull('123456')}123456
${demo1:replaceEmpty('123456')}123456
${demo2:replaceNull('123456')}(三个空格)
${demo2:replaceEmpty('123456')}123456
案例解释
  1. demo1为空,replaceNull替换内容为 123456
  2. demo1为空,replaceEmpty替换内容为 123456
  3. demo2 存在空白字符,replaceNull原样返回
  4. demo2 不存在可见字符,replaceEmpty替换内容为 123456

特殊字符串函数

jsonPath

描述

允许通过表达式直接读取json字符串中的值

参数
  1. 要读取的Json路径
返回值

String

注意
  • $ 代表Json的根
  • 如果读取的路径不存在,将返回空值
  • 如果源字符串不是有效的Json字符串,将返回空值
  • 如果读取到的内容仍然是一个Json对象或数组,将返回该json的字符串形式
案例

假设 流文件 存在一个属性 json,其值为

{
    "a1":"123",
    "a2":{"b1":"11","b2":"12"},
    "a3":"456"
}
表达式输出结果
${json:jsonPath('$.a1')}123
${json:jsonPath('$.a2.b1')}11
${json:jsonPath('$.a6')}(空值)
案例解释
  1. 尝试获取json中的a1
  2. 尝试获取json中的a2.b1
  3. 尝试获取json中的a6(该值不存在)

jsonPathAdd/jsonPathSet

描述

向Json数组或对象中添加值

jsonPathAdd:向Json Array中添加给定的值

jsonPathSet:向Json Object中添加给定的值

参数
  1. 目标路径
  2. 要添加的值
返回值

String

注意
  • 注意区分要添加到Json对象还是数组
案例

假设 流文件 存在一个属性 json,其值为

{
    "a1":"123",
    "a2":{"b1":"11","b2":"12"},
    "a3":[]
}
表达式输出结果
${json:jsonPathAdd('$.a3', 'abc')}{"a1":"123","a2":{"b1":"11","b2":"12"},"a3":["abc"]}
${json:jsonPathSet('$.a1', '999')}{"a1":"999","a2":{"b1":"11","b2":"12"},"a3":[]}
案例解释
  1. 向 a3 Json Array中添加一个值 abc
  2. 向 a1 Json 对象的值修改为 999

jsonPathPut

描述

向Json中指定路径添加键值

参数
  1. 路径(要修改的路径,一定以 $ 开始
  2. 键(要添加的键值对的键)
  3. 值(要添加的键值对的值)
返回值

String

注意
  • 如果源字符串无效(非JSON字符串),将通告一个Json转换相关的异常
案例

假设 流文件 存在一个属性 json,其值为

{
    "a1":"123",
    "a2":{"b1":"11","b2":"12"},
}
表达式输出结果
${json:jsonPathPut('$‘,’a3', 'abc')}{"a1":"123","a2":{"b1":"11","b2":"12"},"a3":"abc"}
案例解释
  1. 在Json根添加一个键值对 "a3":abc

jsonPathDelete

描述
参数

Json路径,指示要删除的位置

返回值

String

注意

案例

假设 流文件 存在一个属性 json,其值为

{
    "a1":"123",
    "a2":{"b1":"11","b2":"12"},
}
表达式输出结果
${json:jsonPathDelete('$.a1')}{"a2":{"b1":"11","b2":"12"}}
案例解释
  1. 删除 json根目录下的 a1 字段

字符串其他函数

length

描述

返回源字符串的长度

参数

返回值

源字符串的长度

注意
  • 如果目标属性或内容不存在,会返回 0 长度
案例

假设 流文件 存在一个属性 demo,其值为demo123demo123

表达式输出结果
${demo:length()}14
案例解释
  1. 获取源字符串的长度

数学运算

基础运算

plus

描述

将源字符串作为数值,并加上参数中提供的值

参数
  1. 数值
返回值

数值(字符串)

注意

案例

假设 流文件 存在一个属性 fileSize,其值为1

表达式输出结果
${fileSize:plus(1)}2
案例解释
  1. 的1 + 1 = 2

minus

描述

将源字符串作为数值,并减去参数中提供的值

参数
  1. 数值
返回值

数值(字符串)

注意

案例

假设 流文件 存在一个属性 fileSize,其值为1

表达式输出结果
${fileSize:minus(1)}0
案例解释
  1. 1 - 1 = 0

multiply

描述

将源字符串作为数值,并乘于参数中提供的值

参数
  1. 数值
返回值

数值(字符串)

注意

案例

假设 流文件 存在一个属性 fileSize,其值为2

表达式输出结果
${fileSize:plus(2)}4
案例解释
  1. 2 *  2 = 4

devide

描述

将源字符串作为数值,并除于参数中提供的值

参数
  1. 数值
返回值

数值(字符串)

注意

案例

假设 流文件 存在一个属性 fileSize,其值为8

表达式输出结果
${fileSize:plus(2)}4
案例解释
  1. 8 / 2 = 4

mod

描述

将源字符串作为数值,并根据参数进行模除

参数
  1. 数值
返回值

数值(字符串)

注意

案例

假设 流文件 存在一个属性 fileSize,其值为100

表达式输出结果
${fileSize:plus(12)}4
案例解释
  1. 100 % 12 = 4

数学转换

toRadix

描述

基数转换

参数
参数
  1. 期望基数(2 - 36)
  2. 最小字符数(可选)
返回值

字符串

源字符串的长度

注意
  • 必须为整数(如果为小数,会首先尝试转为整数)
案例

假设 流文件 存在一个属性 size,其值为1024

表达式输出结果
${size:toRadix(10)}1024
${size:toRadix(2)}10000000000
${size:toRadix(2,16)}0000010000000000
案例解释
  1. 将数值转为10进制(当前已经时十进制)
  2. 将数值转为2进制
  3. 将数值转为2进制,且补全到16位(前面附加0)

fromRadix

描述

将根据指定的源数值基数,将源字符串(整数)转换为10进制

参数
  • 源基数(原本的基数)[2 - 36]
返回值

字符串

注意
  • 必须为整数(如果为小数,会首先尝试转为整数)
案例

假设 流文件 存在一个属性 size,其值为1234A

表达式输出结果
${size:fromRadix(11)}17720
${size:fromRadix(16)}74570
案例解释
  1. 将源字符串视为 11 进制的整数,并转为 10 进制的整数
  2. 将源字符串视为 16 进制的整数,并转为 10 进制的整数

随机数

random

描述

返回一个随机数(不安全的随机数,不建议使用)

参数

返回值

数值

注意

案例
表达式输出结果
${random():mod(10):plus(1)}5
案例解释
  1. 返回一个从1-10之间的随机数

函数调用

math

描述

允许用户通过反射直接调用Java中的math函数

参数
  1. 函数名(Java中的函数名称)
  2. 附加参数(可选,附加在函数中的参数)
返回值

数值

注意
  • 如果目标属性或内容不存在,会返回 0 长度
案例
表达式输出结果
${math("random")}15
案例解释
  1. 调用了Java中的random函数

逻辑运算

字符串比较

isNull/notNull/isEmpty

描述

isNull:为空返回真

notNull:不为空返回真

isEmpty:为空或只包含不可见字符返回真

参数

返回值

Boolean

注意

案例

假设 流文件 存在一个属性 demo1,其值为空

假设 流文件 存在一个属性 demo2,其值为(三个空格)

表达式输出结果
${demo1:isNull()}true
${demo1:notNull()}false
${demo1:isEmpty()}true
${demo2:isNull()}false
${demo2:notNull()}true
${demo2:isEmpty()}true
案例解释
  1. demo1为空,isNull返回true
  2. demo1为空,notNull返回false
  3. demo1为空,isEmpty返回true
  4. demo2仅包含空格,isNull返回false
  5. demo2仅包含空格,notNull返回true
  6. demo2仅包含空格,isEmpty返回true(忽略了空格)

equals/equalsIgnoreCase

描述

equals:判断源字符串和参数字符串是否一致(大小写必须完全相同)

equalsIgnoreCase:判断源字符串和参数字符串是否一致(忽略大小写的区别)

参数
  1. 要比较的值
返回值

Boolean

注意

案例

假设 流文件 存在一个属性 demo,其值为hello

表达式输出结果
${demo:equals('hello')}true
${demo:equalsIgnoreCase('HELLO')}true
案例解释
  1. 将demo的值和参数比较,并返回true
  2. 将demo的值和参数比较,忽略大小写情况下一致,返回true

数值比较

gt/ge

描述

gt:大于

ge:大于等于

参数
  1. 要进行比较的数值
返回值

Boolean

注意
  • 参数必须为数字,如果无法转换为数字,将返回false
案例

假设 流文件 存在一个属性 num,其值为10

表达式输出结果
${num:gt( 9 )}true
${num:ge( 10 )}true
案例解释
  1. 判断 num 是否大于 9
  2. 判断 num 是否大于等于 10

lt/le

描述

lt:小于

le:小于等于

参数
  1. 要进行比较的数值
返回值

Boolean

注意
  • 参数必须为数字,如果无法转换为数字,将返回false
案例

假设 流文件 存在一个属性 num,其值为10

表达式输出结果
${num:lt( 5 )}false
${num:le( 5 )}false
案例解释
  1. 判断 num 是否小于 5
  2. 判断 num 是否小于等于 5

逻辑控制

and/or/not

描述

and:逻辑与

or:逻辑或

not:逻辑非

参数
  1. 要进行比较的数值
返回值

Boolean

注意

案例

假设 流文件 存在一个属性 num,其值为10

表达式输出结果
${num:ge( 9 )}:and(${num:ge( 10 )})}true
${num:lt( 5 )}:or(${num:ge( 10 )})}true
${num:lt( 5 )}:or(${num:ge( 10 )}):not()}false
案例解释
  1. 判断 (10是否大于9) 且 (10 是否大于等于 10)
  2. 判断 (10是否小于5) 或 (10 是否大于等于 10)
  3. 判断 非((10是否小于5) 或 (10 是否大于等于 10))

ifElse

描述

类似Java中的三目运算,如果条件成立,使用第一个参数的值,如果不成立,使用第二个参数的值

参数
  1. 条件成立时使用的值
  2. 条件不成立时使用的值
返回值

字符串(根据参数类型)

注意

案例

假设 流文件 存在一个属性 bool,其值为true

表达式输出结果
${bool:ifElse('a','b')}a
案例解释
  1. 判断bool的值,因为其值为true,因此选用第一个参数作为返回值返回

时间函数

now/format

描述

now:获取当前日期和时间

format:格式化时间

参数

返回值

Date

注意
  • 如果进行时间比较,先转为毫秒再比较
案例
表达式输出结果
${now()}当前时间
${now():toNumber()}从1970年1月1日0时0分开始的毫秒数
${now():toNumber():minus(86400000)昨天(24小时前)
${now():format('yyyy')}当前年(如2021)
${now():format('yyyyMMdd')}当前日期(如20210728)
${now():format("yyyy-MM-dd HH:mm:ss")}日期和时间(2021-07-28 09:24:35)
案例解释
  1. 直接获取当前时间,一般不要直接用这个函数
  2. 获取当前时间的毫秒数
  3. 获取昨天的日期(毫秒)
  4. 获取今年的年份
  5. 获取当前日期
  6. 获取当前日期和时间

通用函数

URL编解码

urlEncode/urlDecode

描述

urlEncode:返回对于网站而言友好的Url版本

urlDecode:将编码后的Url还原回人类友好的版本

参数

返回值

对网站友好的URL版本

注意

案例

假设 流文件 存在一个属性 url,其值为http://www.tineaine.com

假设 流文件 存在一个属性 url2,其值为http%3A%2F%2Fwww.tineaine.com

表达式输出结果
${url:urlEncode()}http%3A%2F%2Fwww.tineaine.com
${url:urlurlDecode()}http://www.tineaine.com
案例解释
  1. 对目标URL进行编码
  2. 对目标URL进行解码

字符串编解码

base64Encode/base64Decode

描述

base64Encode:将源字符串进行base64编码

base64Decode:将源字符串进行base64解码

参数

返回值

字符串

注意
  • 编码字符集为 ascii
案例

假设 流文件 存在一个属性 user,其值为admin:admin

假设 流文件 存在一个属性 pass,其值为YWRtaW46YWRtaW4=

表达式输出结果
${user:base64Encode()}YWRtaW46YWRtaW4=
${pass:base64Decode()}admin:admin
案例解释
  1. 对字符串进行base64编码
  2. 对字符串进行base64解码

hash

描述

使用提供的哈希算法返回一个十六进制编码的字符串。可用于生成惟一标识。

参数
  1. 算法(计算Hash时使用的算法)[SHA-384, SHA-224, SHA-256, MD2, SHA, SHA-512, MD5]
返回值

字符串

注意
注意
  • MD2, MD5, 和 SHA (SHA-1)不被认为是加密安全的算法
案例

假设 流文件 存在一个属性 payload ,其值为string value

表达式输出结果
${payload:hash('SHA-256')}9b6a1a9167a5caf3f5948413faa89e0ec0de89e12bef55327442e60dcc0e8c9b
案例解释
  1. 对目标URL进行编码
  2. 对目标URL进行解码

类型转换

toString

描述

将源字符串转换为字符串格式

参数

返回值

String

注意

案例

假设 流文件 存在一个属性 demo,其值为123

表达式输出结果
${demo:toNumber():toString()}123
案例解释
  1. 将其转为Number,然后再转为String,注意,属性值默认情况下均被视为String类型

toNumber

描述

将源字符串转换为整数格式

参数

返回值

Number

注意

案例

假设 流文件 存在一个属性 demo,其值为123

表达式输出结果
${demo:toNumber()}123
案例解释
  1. 将String转换为Number类型(相当于Java中的Integer)

toDecimal

描述

将源字符串转换为浮点格式

参数

返回值

Decimal

注意
  • 该函数只能保留一位小数
案例

假设 流文件 存在一个属性 demo,其值为123.1

表达式输出结果
${demo:toDecimal()}123.1
案例解释
  1. 将String转为Decimal类型(转为浮点类型)

toDate

描述

将源字符串转换为日期格式

参数
  1. 格式化方式,必须符合Java中SimpleDateFormat的要求
  2. 时区(可选)
返回值

Date

注意

案例

假设 流文件 存在一个属性 date,其值为2021

表达式输出结果
${demo:toDate('yyyy', 'GMT')}2021/12/31 15:36:03.264Z
案例解释
  1. 将String转换为Date类型