概述

ACAL Lynxus 中的所有数据都由一个称为 FlowFile 的抽象表示。FlowFile 由两个主要部分组成:内容和属性。FlowFile 的内容部分表示要操作的数据。例如,如果使用 GetFile 处理器从本地文件系统获取文件,文件的内容将成为 FlowFile 的内容。

FlowFile 的属性部分表示关于数据本身的信息,即元数据。属性是键值对,表示对数据的已知信息以及对适当路由和处理数据有用的信息。继续从本地文件系统获取文件的示例,FlowFile 将具有一个名为 filename 的属性,反映文件系统上文件的名称。此外,FlowFile 将具有一个 path 属性,反映文件系统中该文件所在的目录。FlowFile 还将具有一个名为 uuid 的属性,这是该 FlowFile 的唯一标识符。有关核心属性的完整列表,请参阅开发者指南的 FlowFile 部分。

然而,如果用户无法使用这些属性,将它们放在 FlowFile 上并没有太大好处。Lynxus 表达式语言提供了引用这些属性、将它们与其他值进行比较以及操作其值的能力。

Lynxus 表达式的结构

Lynxus 表达式语言始终以起始分隔符 ${ 开始,以结束分隔符 } 结束。在起始和结束分隔符之间是表达式本身的文本。在最基本的形式中,表达式可以仅由一个属性名组成。例如,${filename} 将返回 filename 属性的值。

在稍微复杂的示例中,我们可以返回该值的一个操作。例如,我们可以通过调用 toUpper 函数返回文件名的大写版本:${filename:toUpper()}。在这种情况下,我们引用 filename 属性,然后使用 toUpper 函数操作该值。函数调用由 5 个元素组成。第一,有一个函数调用分隔符 :。第二是函数名——在本例中为 toUpper。接下来是左括号 ((),后跟函数参数。所需的参数取决于正在调用的函数。在此示例中,我们使用的是 toUpper 函数,它没有任何参数,因此省略此元素。最后,右括号 ()) 表示函数调用的结束。表达式语言支持许多不同的函数来实现许多不同的目标。一些函数提供字符串(文本)操作,如 toUpper 函数。其他函数,如 equals 和 matches 函数,提供比较功能。还有用于操作日期和时间以及执行数学运算的函数。每个函数都在下面的函数部分中描述,包括函数功能的解释、所需的参数以及返回的信息类型。

当我们对属性执行函数调用时,如上所述,我们将属性称为函数的 主体,因为属性是函数操作的实体。然后我们可以将多个函数调用链接在一起,其中第一个函数的返回值成为第二个函数的主体,其返回值成为第三个函数的主体,依此类推。继续我们的示例,我们可以通过表达式 ${filename:toUpper():equals('HELLO.TXT')} 链接多个函数。可以链接在一起的函数数量没有限制。

可以使用表达式语言引用任何 FlowFile 属性。但是,如果属性名包含"特殊字符",则必须通过引号括起来转义属性名。以下字符每个都被视为"特殊字符":

  • $(美元符号)

  • |(管道符)

  • {(左花括号)

  • }(右花括号)

  • ((左圆括号)

  • )(右圆括号)

  • [(左方括号)

  • ](右方括号)

  • ,(逗号)

  • :(冒号)

  • ;(分号)

  • /(正斜杠)

  • *(星号)

  • '(单引号)

  • (空格)

  • \t(制表符)

  • \r(回车)

  • \n(换行)

此外,如果数字是属性名的第一个字符,则也被视为"特殊字符"。如果这些特殊字符中的任何一个出现在属性中,则使用单引号或双引号括起来。表达式语言允许单引号和双引号互换使用。例如,以下可用于转义名为 my attribute 的属性:${"my attribute"} 或 ${'my attribute'}。

在此示例中,要返回的值是"my attribute"属性的值(如果存在)。表达式语言将通过层次结构搜索匹配的属性。请参阅表达式语言层次结构了解层次结构的描述。

还有一些函数期望没有主体。这些函数只需在表达式开头调用函数即可调用,例如 ${hostname()}。这些函数也可以链接在一起。例如,${hostname():toUpper()}。尝试使用主体求值函数将导致错误。在下面的函数部分中,这些函数将在其描述中清楚地表明它们不需要主体。

通常,我们需要比较两个不同属性的值。我们可以通过使用嵌入式表达式来实现这一点。例如,我们可以检查 filename 属性是否与 uuid 属性相同:${filename:equals( ${uuid} )}。注意这里,在 equals 方法的左括号和嵌入式表达式之间有一个空格。这不是必需的,也不会以任何方式影响表达式的求值。相反,它是为了使表达式更易于阅读。表达式语言在分隔符之间忽略空格。因此,我们可以使用表达式 ${ filename : equals(${ uuid}) } 或 ${filename:equals(${uuid})},两个表达式的含义相同。但是,我们不能使用 ${file name:equals(${uuid})},因为这会导致 file 和 name 被解释为不同的标记,而不是单个标记 filename。

表达式语言层次结构

当使用表达式语言按名称引用属性时,Lynxus 将在一个定义的层次结构中搜索该值。

Lynxus 中当前的层次结构如下:

  1. 在 FlowFile 中搜索属性/键2. 在 Lynxus JVM 属性中搜索属性/键3. 在系统环境变量中搜索属性/键

Lynxus 将搜索并返回匹配属性的第一个出现。如果找不到匹配的属性,则返回 null。

应用程序中的表达式语言

表达式语言在 Lynxus 应用程序中被大量用于配置处理器属性。但是,并非所有处理器属性都支持表达式语言。属性是否支持表达式语言由处理器开发者在编写处理器时确定。但是,应用程序会努力为每个属性清楚地说明是否支持表达式语言。

在应用程序中,配置组件属性时,用户界面在属性名称旁边提供一个信息图标(信息)。将鼠标悬停在此图标上将提供一个工具提示,提供有关属性的有用信息。此信息包括属性的描述、默认值(如果有)、历史配置值(如果有)以及该属性的表达式语言求值范围。表达式语言的求值范围是层次化的,有三个值:NONE → ENVIRONMENT → FLOWFILE_ATTRIBUTES。

  • NONE - 此属性不支持表达式语言

  • ENVIRONMENT - 将使用在 JVM 级别定义的环境变量和系统属性。

  • FLOWFILE_ATTRIBUTES - 将使用每个单独流文件的属性,以及上述环境变量定义的变量。

转义表达式语言

有时属性支持表达式语言,但用户希望使用与表达式语言语法相同的字面值。例如,用户可能希望将属性值配置为字面文本 Hello ${UserName}。在这种情况下,可以通过在表达式之前使用额外的`$(美元符号)来转义它(即 `Hello $${UserName})。除非 $ 字符用于转义表达式,否则不应转义。例如,值 Hello $$User$$Name不应转义 `$ 字符,因此使用的字面值就是 Hello $$User$$Name。

如果在 { 之前连续遇到两个以上的 $ 字符,则每对 $ 字符将被视为对 $`字符的转义。转义将从左到右执行。为了帮助说明这一点,假设变量 `abc 包含值 xyz。然后,考虑以下表达式及其对应求值后的值的表格:

Table 1. 转义 EL 示例

表达式

值

说明

${abc}

xyz

$${abc}

${abc}

$$${abc}

$xyz

$$$${abc}

$${abc}

$$$$${abc}

$$xyz

I owe you $5

I owe you $5

此处没有实际的表达式。

You owe me $$5 too

You owe me $$5 too

$ 字符未被转义,因为它不紧接在表达式之前。

Unescaped $$${5 because no closing brace

Unescaped $$${5 because no closing brace

因为此处没有右花括号,所以没有实际的表达式,因此 $ 字符未被 转义。

Unescaped $$${5} because no closing brace

<Error>

此表达式无效,因为它等同于一个转义的 $,后跟 ${5},而 ${5} 不是有效的表达式。数字 必须被转义。

Unescaped $$${'5'} because no closing brace

Unescaped $ because no closing brace

没有名为 5 的属性,因此表达式的计算结果为空字符串。$$ 解析为一个 单个(转义的)$,因为它紧接在表达式之前。

表达式语言编辑器

配置处理器属性的值时,Lynxus 用户界面通过表达式语言编辑器提供帮助。一旦通过输入 ${ 开始表达式,编辑器就会开始高亮显示括号和花括号,使用户能够轻松判断哪个左括号或花括号与哪个右括号或花括号匹配。左圆括号或花括号与哪个右圆括号或花括号匹配。编辑器还提供上下文相关的帮助,提供可在当前光标位置使用的所有函数的列表。要激活此功能,请按键盘上的 Ctrl+Space。用户还可以输入函数名的一部分,然后按 Ctrl+Space 查看可以使用的、以相同前缀开头的所有函数。例如,如果我们在编辑器中输入 ${filename:to`然后按 Ctrl+Space,会弹出一个列出六个不同函数的窗口:`toDate、toLower、toNumber、toRadix、toString 和 toUpper。然后可以继续输入以缩小显示的函数范围,或者可以通过双击鼠标或使用方向键高亮显示所需函数并按 Enter 来从列表中选择函数。toLower、toNumber、toRadix、toString 和 toUpper。然后可以继续输入以缩小要激活此功能,请按键盘上的 Ctrl+Space。用户还可以输入函数名的一部分,然后按 Ctrl+Space 查看可以使用的、以相同前缀开头的所有函数。例如,如果我们在编辑器中输入 ${filename:to`然后按 Ctrl+Space,会弹出一个列出六个不同函数的窗口:`toDate、toLower、toNumber、toRadix、toString 和 toUpper。然后可以继续输入以缩小显示的函数范围,或者可以通过双击鼠标或使用方向键高亮显示所需函数并按 Enter 来从列表中选择函数。

框架系统属性

以下系统属性由 Lynxus 应用程序设置,可用于表达式语言:

  • lynxus.framework.version:Lynxus 框架的构建版本。用法:${'lynxus.framework.version'}

函数

函数提供了一种方便的方式来操作和比较属性值。表达式语言提供了许多不同的函数来满足自动化数据流的需求。每个函数接受零个或多个参数并返回一个值。然后可以将这些函数链接在一起,创建强大的表达式来求值条件和操作值。有关如何调用和链接函数的更多信息,请参阅Lynxus 表达式的结构。

数据类型

函数的每个参数和每个返回值都有特定的数据类型。表达式语言支持四种不同的数据类型:

  • 字符串:字符串是一个字符序列,可以包含数字、字母、空格和特殊字符。

  • 数字:数字是由一个或多个数字(0 到 9)组成的整数。当从日期数据类型转换为数字时,它们表示为自 1970 年 1 月 1 日 GMT 午夜以来的毫秒数。

  • 小数:小数是一个数值,可以支持小数和更大的值,精度损失最小。更准确地说,它是双精度 64 位 IEEE 754 浮点数。由于这种最小精度损失,此数据类型不应用于非常精确的值,如货币。

  • 日期:日期是一个保存日期和时间的对象。使用日期操作和[type_cast]函数,此数据类型可以与字符串和数字相互转换。

  • 布尔:布尔值是 true 或 false 之一。

  • 小数:小数是一个数值,可以支持小数和更大的值,精度损失最小。更准确地说,它是 双精度 64 位 IEEE 754 浮点数。由于这种最小精度损失,此数据类型不应用于 非常精确的值,如货币。有关此数据类型存储的值范围的更多文档, 请参阅此 链接。以下是表达式语言中支持的字面小数形式的一些示例("E"也可以是小写): 表达式语言中支持的字面小数("E"也可以是小写):

    • 1.1

    • .1E1

    • 1.11E-12

  • 日期:日期是一个保存日期和时间的对象。利用日期操作和[type_cast]函数,此数据 类型可以与字符串和数字相互转换。如果整个表达式语言表达式解析为 日期,则它将转换为格式为"<星期> <月份> <日期> <小时>:<分钟>:<秒> <时区> <年份>"的字符串。 也用 Java DateTimeFormatter 格式表示为"E MMM dd HH:mm:ss z yyyy"。例如:"Wed Dec 31 12:00:04 UTC 2016"。

  • 布尔:布尔值是 true 或 false 之一。

解析完表达式语言函数后,所有属性都以字符串类型存储。

表达式语言通常能够自动将一种数据类型的值强制转换为函数所需的适当数据类型。但是,确实存在手动将值强制转换为特定数据类型的函数。有关更多信息,请参阅[type_cast]部分。

数字和小数类型支持十六进制值,但在将其解释为字面值时,必须用引号括起来并在前面加上"0x"。例如,这两个表达式是有效的(如果没有引号或"0x",表达式将无法正确运行):被解释为字面量。例如,以下两个表达式是有效的(不带引号或 "0x" 表达式将无法正常运行):

  • ${literal("0xF"):toNumber()}

  • ${literal("0xF.Fp10"):toDecimal()}

布尔逻辑

表达式语言最强大的功能之一是将属性值与某个其他值进行比较的能力。这经常用于例如配置处理器应如何路由数据。以下函数用于执行布尔逻辑,例如比较两个值。这些函数中的每一个都设计为在布尔类型的值上工作。

isNull(判空)

描述:isNull 函数在主体为 null 时返回 true,否则返回 false。这通常用于确定属性是否存在。

主体类型:任意

参数:无参数

返回类型:布尔

示例:${filename:isNull()} 在以下条件满足时返回 true:"filename" 属性不存在。 如果属性存在,则返回 false。

notNull(非空)

描述:notNull 函数返回与 isNull 函数相反的值。即,如果主体存在则返回 true,否则返回 false。

主体类型:任意

参数:无参数

返回类型:布尔

示例:${filename:notNull()} 在 "filename" 属性存在时返回 true。如果属性不存在,则返回 false。

isEmpty(判空串)

描述:isEmpty 函数在主体为 null、不包含任何字符或仅包含空白字符(换行、回车、空格、制表符)时返回 true,否则返回 false。

主体类型:字符串

参数:无参数

返回类型:布尔

示例:${filename:isEmpty()} 在 "filename" 属性不存在或仅包含空白字符时返回 true。${literal(" "):isEmpty()} 返回 true,${literal(""):isEmpty()} 也返回 true。

equals(等于)

描述:equals 函数使用非常广泛,用于确定其主体是否等于另一个字符串值。请注意,equals 函数对两个字符串值执行直接比较。注意不要将此函数与 [matches] 函数混淆,后者根据正则表达式解析其主体。

主体类型:任意

参数:- value : 要与主体比较的值。必须与主体类型相同。

返回类型:布尔

示例:我们可以通过表达式 ${filename:equals('hello.txt')} 来检查 FlowFile 的文件名是否为 "hello.txt", 或者可以检查属性 hello 的值是否等于 filename 属性的值:${hello:equals( ${filename} )}。

equalsIgnoreCase(忽略大小写比较)

描述:与 equals 函数类似,equalsIgnoreCase 函数将其主体与字符串值进行比较,但如果两个值仅在大小写上不同(大写 vs. 小写),则返回 true。

主体类型:字符串

参数:- value : 要与主体比较的值。

返回类型:布尔

示例:如果文件名等于 "hello.txt"、"HELLO.TXT" 或 "HeLLo.TxT",${filename:equalsIgnoreCase('hello.txt')} 将返回 true。

gt(大于)

描述:gt 函数用于数值比较,在主体大于其参数时返回 true。如果主体或参数无法强制转换为数字,此函数将返回 false。

主体类型:数字

参数:- value : 要与主体比较的数字。

返回类型:布尔

示例:如果 FlowFile 内容的大小超过 1 KB(1024 字节),${fileSize:gt( 1024 )} 将返回 true。否则,它将返回 false。

ge(大于等于)

描述:ge 函数用于数值比较,在主体大于或等于其参数时返回 true。如果主体或参数无法强制转换为数字,此函数将返回 false。

主体类型:数字

参数:- value : 要与主体比较的数字。

返回类型:布尔

示例:如果 FlowFile 内容的大小至少为(大于或等于)1 KB(1024 字节),${fileSize:ge( 1024 )} 将返回 true。否则,它将返回 false。

lt(小于)

描述:lt 函数用于数值比较,在主体小于其参数时返回 true。如果主体或参数无法强制转换为数字,此函数将返回 false。

主体类型:数字

参数:- value : 要与主体比较的数字。

返回类型:布尔

示例:如果 FlowFile 内容的大小小于 1 MB(1048576 字节),${fileSize:lt( 1048576 )} 将返回 true。否则,它将返回 false。

le(小于等于)

描述:le 函数用于数值比较,在主体小于或等于其参数时返回 true。如果主体或参数无法强制转换为数字,此函数将返回 false。

主体类型:数字

参数:- value : 要与主体比较的数字。

返回类型:布尔

示例:如果 FlowFile 内容的大小最多为(小于或等于)1 MB(1048576 字节),${fileSize:le( 1048576 )} 将返回 true。否则,它将返回 false。

and(与)

描述:and 函数接受一个布尔值作为参数,在主体和参数都为 true 时返回 true。如果主体或参数为 false 或无法强制转换为布尔值,函数将返回 false。通常,这与嵌入式表达式一起用作参数。

主体类型:布尔

参数:- condition : 'and' 表达式的右侧

返回类型:布尔

示例:我们可以通过以下表达式检查文件名是否全为小写且至少有 5 个字符:

${filename:toLower():equals( ${filename} ):and(
	${filename:length():ge(5)}
)}

or(或)

描述:or 函数接受一个布尔值作为参数,在主体或参数为 true 时返回 true。如果主体和参数都为 false,函数将返回 false。如果主体或参数无法强制转换为布尔值,此函数将返回 false。

主体类型:布尔

参数:- condition : 'and' 表达式的右侧

返回类型:布尔

示例:如果文件名恰好有 5 个字符或文件名全为小写,以下示例将返回 true。

${filename:toLower():equals( ${filename} ):or(
	${filename:length():equals(5)}
)}

not(非)

描述:not 函数返回主体的布尔值的否定。

主体类型:布尔

参数:无参数

返回类型:布尔

示例:我们可以通过使用 not 函数来反转另一个函数的值,如 ${filename:equals('hello.txt'):not()}。如果 filename 不等于 "hello.txt",则返回 true;如果 filename 为 "hello.txt",则返回 false。

ifElse(条件)

描述:如果主体的值为 true,则返回第一个参数的值;如果主体的值为 false,则返回第二个参数的值。

主体类型:布尔

参数:- EvaluateIfTrue : 如果主体为 true 时返回的值 - EvaluateIfFalse : 如果主体为 false 时返回的值

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt","nullFilename" 属性的值为 null,"bool" 属性的值为 "true",则以下表达式将提供以下结果:

Table 2. ifElse 示例

表达式

值

${bool:ifElse('a','b')}

a

${literal(true):ifElse('a','b')}

a

${nullFilename:isNull():ifElse('file 不存在', 'located file')}

file 不存在

${nullFilename:ifElse('found', 'not_found')}

not_found

${filename:ifElse('found', 'not_found')}

not_found

${filename:isNull():not():ifElse('found', 'not_found')}

found

isJson(JSON 检测)

描述:isJson 函数在主体是 JSON 数组或 JSON 对象时返回 true,否则返回 false。这通常用于确定属性是否为 JSON,以便进行后续的 JSONPath 查询。虽然技术上还有其他有效的 JSON 类型(如字符串、数字、布尔值和 null),但此方法仅关注 JSONPath 查询的主要 JSON 对象:数组和对象。

主体类型:任意

参数:无参数

返回类型:布尔

示例:如果属性 "jsonObj" 的值为 {"name":"John", "age":30, "car":null},属性 jsonObjMissingStartingBrace 的值为 "name":"John", "age":30, "car":null},属性 jsonObjMissingEndingBrace 的值为 {"name":"John", "age":30, "car":null,属性 "jsonArray" 的值为 ["Ford", "BMW", "Fiat"],属性 jsonArrayMissingStartingBracket 的值为 "Ford", "BMW", "Fiat"],属性 jsonArrayMissingEndingBracket 的值为 ["Ford", "BMW", "Fiat","someAttribute" 属性不存在,"emptyQuotedString" 属性值为 "",属性 "quotedString" 的值为 "someString",属性 "integer" 的值为 1234,属性 "decimal" 的值为 18.36,属性 "trueAttr" 的值为 true,属性 "falseAttr" 的值为 false,"nullAttr" 属性的值为 null,则以下表达式将产生以下结果:

Table 3. isJson 示例

表达式

值

${jsonObj:isJson()}

true

${jsonObjMissingStartingBrace:isJson()}

false

${jsonObjMissingEndingBrace:isJson()}

false

${jsonArray:isJson()}

true

${jsonArrayMissingStartingBracket:isJson()}

false

${jsonArrayMissingEndingBracket:isJson()}

false

${someAttribute:isJson()}

false

${emptyQuotedString:isJson()}

false

${quotedString:isJson()}

false

${integer:isJson()}

false

${decimal:isJson()}

false

${trueAttr:isJson()}

false

${falseAttr:isJson()}

false

${nullAttr:isJson()}

false

isValidInstant(有效时刻检测)

描述:isValidInstant 函数在主体可以被解析为有效的 ISO-8601 时刻或 RFC-1123 日期时间时返回 true,否则返回 false。此函数对于在调用 toInstant() 之前验证值很有用。与 toInstant() 不同,此函数在解析失败时不会抛出错误。

主体类型:字符串

参数:无参数

返回类型:布尔

Table 4. isValidInstant 示例

表达式

值

${eventTime:isValidInstant()} where eventTime = 2026-08-04T10:15:30Z

true

${eventTime:isValidInstant()} where eventTime = 2026-08-04T10:15:30+05:30

true

${eventTime:isValidInstant()} where eventTime = Tue, 04 Aug 2026 10:15:30 GMT

true

${eventTime:isValidInstant()} where eventTime = not-a-date

false

${eventTime:isValidInstant():ifElse('valid-instant', 'invalid-instant')} where eventTime = 2026-08-04T10:15:30Z

valid-instant

isValidDate(有效日期检测)

描述:isValidDate 函数在主体可以使用指定的格式和可选时区被解析为有效日期时返回 true,否则返回 false。验证遵循日历规则,因此匹配格式模式但不代表真实日期的值(如 31-02-2026)将返回 false。此函数对于在调用 toDate() 之前验证值很有用。与 toDate() 不同,此函数在解析失败时不会抛出错误。

主体类型:字符串

参数:- format(必需):用于解析的日期格式。格式必须是有效的 java.time.format.DateTimeFormatter 模式,如 dd-MM-yyyy。 - timezone(可选):解析日期时间字段时应用的时区,如 UTC 或 America/New_York。未提供时,使用系统默认时区。

返回类型:布尔

Table 5. isValidDate 示例

表达式

值

${myDate:isValidDate('dd-MM-yyyy')} where myDate = 04-08-2026

true

${myDate:isValidDate('dd-MM-yyyy')} where myDate = 31-02-2026

false

${myDate:isValidDate('dd-MM-yyyy')} where myDate = not-a-date

false

${myDate:isValidDate('yyyy-MM-dd HH:mm:ss', 'UTC')} where myDate = 2026-08-04 10:15:30

true

${myDate:isValidDate('dd-MM-yyyy'):ifElse('valid', 'invalid')} where myDate = 04-08-2026

valid

字符串操作

以下每个函数都以某种方式操作字符串。

toUpper(转大写)

描述:此函数将主体转换为全大写字母字符串。换句话说,它将任何小写字母替换为对应的大写字母。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "filename" 属性为 "abc123.txt",则表达式 ${filename:toUpper()} 将返回 "ABC123.TXT"

toLower(转小写)

描述:此函数将主体转换为全小写字母字符串。换句话说,它将任何大写字母替换为对应的小写字母。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "filename" 属性为 "ABC123.TXT",则表达式 ${filename:toLower()} 将返回 "abc123.txt"

trim(去空白)

描述:trim 函数将移除主体中所有的前导和尾随空白字符。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果属性 attr 的值为 " 1 2 3 ",则表达式 ${attr:trim()} 将 返回 值 "1 2 3".

substring(子串)

描述:根据给定的起始索引和可选的结束索引,返回主体的一部分。 如果未提供结束索引,则返回从给定起始索引到主体末尾的部分。

起始索引 和 结束索引 从 0 开始。也就是说,第一个字符的引用使用 值 0,而不是 1。

如果 起始索引 或 结束索引 不是数字,则此函数调用将导致 出错。

如果 起始索引 大于 结束索引,则此函数调用将导致出错。

如果 起始索引 或 结束索引 大于主体的长度,或其值 小于 0,则此函数调用将返回一个空字符串。

主体类型:字符串

参数:- starting index : 要捕获的第一个字符的从 0 开始的索引(包含) - ending index : 要捕获的最后一个字符的从 0 开始的索引(不包含)

返回类型:字符串

示例:如果我们有一个名为 "filename" 的属性,其值为 "a brand new filename.txt", 则以下表达式将产生以下值:

Table 6. Substring 示例

表达式

值

${filename:substring(0,1)}

a

${filename:substring(2)}

brand new filename.txt

${filename:substring(12)}

filename.txt

${filename:substring( ${filename:length():minus(2)} )}

xt

substringBefore(截取前子串)

描述:返回主体的一部分,从主体的第一个字符开始, 到参数的第一次出现之前的字符结束。如果 参数在主体中不存在,则返回整个主体。

主体类型:字符串

参数:- value : 要在主体中搜索的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt", 则以下表达式将产生以下值:

Table 7. SubstringBefore 示例

表达式

值

${filename:substringBefore('.')}

a brand new filename

${filename:substringBefore(' ')}

a

${filename:substringBefore(' n')}

a brand

${filename:substringBefore('missing')}

a brand new filename.txt

substringBeforeLast(截取最后匹配前子串)

描述:返回主体的一部分,从主体的第一个字符开始, 到参数的最后一次出现之前的字符结束。如果 参数在主体中不存在,则返回整个主体。

主体类型:字符串

参数:- value : 要在主体中搜索的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt", 则以下表达式将产生以下值:

Table 8. SubstringBeforeLast 示例

表达式

值

${filename:substringBeforeLast('.')}

a brand new filename

${filename:substringBeforeLast(' ')}

a brand new

${filename:substringBeforeLast(' n')}

a brand

${filename:substringBeforeLast('missing')}

a brand new filename.txt

substringAfter(截取后子串)

描述:返回主体的一部分,从参数的第一次出现之后的字符开始, 延伸到主体的末尾。如果 参数在主体中不存在,则返回整个主体。

主体类型:字符串

参数:- value : 要在主体中搜索的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt", 则以下表达式将产生以下值:

Table 9. SubstringAfter 示例

表达式

值

${filename:substringAfter('.')}

txt

${filename:substringAfter(' ')}

brand new filename.txt

${filename:substringAfter(' n')}

ew filename.txt

${filename:substringAfter('missing')}

a brand new filename.txt

substringAfterLast(截取最后匹配后子串)

描述:返回主体的一部分,从参数的最后一次出现之后的字符开始, 延伸到主体的末尾。如果 参数在主体中不存在,则返回整个主体。

主体类型:字符串

参数:- value : 要在主体中搜索的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt", 则以下表达式将产生以下值:

Table 10. SubstringAfterLast 示例

表达式

值

${filename:substringAfterLast('.')}

txt

${filename:substringAfterLast(' ')}

filename.txt

${filename:substringAfterLast(' n')}

ew filename.txt

${filename:substringAfterLast('missing')}

a brand new filename.txt

getDelimitedField(获取分隔字段)

描述:将主体解析为一行分隔文本,并从该分隔文本中返回单个字段。

主体类型:字符串

参数:- index : 要返回的字段的索引。值为 1 将返回第一个字段, 值为 2 将返回第二个字段,以此类推。 - delimiter : 可选参数,提供用作字段分隔符的字符。 如果未指定,将使用逗号。此值必须恰好为 1 个字符。 - quoteChar : 可选参数,提供用于引用值的字符, 以便分隔符可以在单个字段内使用。如果未指定,将使用双引号 (")。此值 必须恰好为 1 个字符。 - escapeChar : 可选参数,提供用于转义引用字符 或字段内分隔符的字符。如果未指定,将使用反斜杠 (\)。此值必须恰好为 1 个字符。 - stripChars : 可选参数,指定是否应移除引用字符和转义字符。 例如,如果字段值为 "1, 2, 3" 且此值为 true,我们将得到值 1, 2, 3,但如果此 值为 false,我们将得到带引号的值 "1, 2, 3"。默认值为 false。此值必须为 true 或 false。

返回类型:字符串

示例:如果 "line" 属性包含值 "Jacobson, John", 32, Mr., "altLine" 属性包含值 Jacobson, John|32|Mr., 则以下表达式将产生以下值:

Table 11. GetDelimitedField 示例

表达式

值

${line:getDelimitedField(2)}

_(space)_32

${line:getDelimitedField(2):trim()}

32

${line:getDelimitedField(1)}

"Jacobson, John"

${line:getDelimitedField(1, ',', '"', '\\', true)}

Jacobson, John

${altLine:getDelimitedField(1, '|')}

Jacobson, John

compactDelimitedList(紧凑分隔列表)

描述:使用指定的分隔符拆分主体,移除所有空标记,并使用相同的分隔符重新连接剩余标记。 非空标记的顺序被保留。这对于规范化包含前导、尾随或重复分隔符的分隔属性非常有用。

主体类型:字符串

参数:- delimiter : 用于拆分和重新连接主体的分隔符。 可以是单个字符或多字符字符串。

返回类型:字符串

示例:如果 "my_list" 属性包含值 ,,a,,b,,c,,"tags" 属性包含值 |alpha||beta|||gamma|,"messy" 属性包含值 ` ,,a,,b,, `,则以下表达式将产生以下值:

Table 12. CompactDelimitedList 示例

表达式

值

${my_list:compactDelimitedList(',')}

a,b,c

${tags:compactDelimitedList('|')}

alpha|beta|gamma

${messy:trim():compactDelimitedList(',')}

a,b

trimDelimitedList(修剪分隔列表)

描述:使用指定的分隔符拆分主体,移除前导 和尾随空标记,并使用相同的分隔符重新连接。非空标记之间的空标记会被保留。此函数的行为类似于 trim(),但作用于分隔标记边界而非空白字符。

主体类型:字符串

参数:- delimiter : 用于拆分和重新连接主体的分隔符。 可以是单个字符或多字符字符串。

返回类型:字符串

示例:如果 "my_list" 属性包含值 ,,a,,b,,c,,, "path_parts" 属性包含值 ;;alpha;;beta;;,"messy"属性包含值 ` ,,a,,b,, `,则以下表达式将产生以下值:

Table 13. TrimDelimitedList 示例

表达式

值

${my_list:trimDelimitedList(',')}

a,,b,,c

${path_parts:trimDelimitedList(';')}

alpha;;beta

${messy:trim():trimDelimitedList(',')}

a,,b

unique(去重)

描述:从分隔字符串中返回唯一值,同时保留首次出现的顺序。该函数接受一个分隔符作为参数,并返回由相同分隔符连接的去重值。

主体类型:字符串

参数:- delimiter : 用于拆分和连接主体字符串的分隔符

返回类型:字符串

示例:如果 "tags" 属性的值为 "red,blue,red,green,blue,yellow",则以下 表达式将产生以下值:

Table 14. Unique 示例

表达式

值

${tags:unique(',')}

red,blue,green,yellow

${tags:unique(';')}

red,blue,red,green,blue,yellow

如果 "paths" 属性的值为 "C:\Users\test;D:\Data;C:\Users\test;E:\Backup",则:

Table 15. 路径去重

表达式

值

${paths:unique(';')}

C:\Users\test;D:\Data;E:\Backup

特殊情况:如果主体为 null,则返回空字符串。如果分隔符为 null 或为空,则返回原始主体不变。空值会被保留(例如,"a,,b,,c" 变为 "a,,b,c")。

append(追加)

描述:append 函数返回将参数追加到主体值的结果。 如果主体为 null,则返回参数本身。

主体类型:字符串

参数:- value : 要添加到主体末尾的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则表达式 ${filename:append('.gz')} 将返回 "a brand new filename.txt.gz".

prepend(前缀)

描述:prepend 函数返回将参数前置到主体值的结果。 如果主体为 null,则返回参数本身。

主体类型:字符串

参数:- value : 要添加到主体开头的字符串

返回类型:字符串

示例:如果 "filename" 属性的值为 "filename.txt",则表达式 ${filename:prepend('a brand new ')} 将返回 "a brand new filename.txt"。

replace(替换)

描述:将主体中一个文本字符串的*所有*出现替换为另一个字符串。

主体类型:字符串

参数:- Search String : 要在主体中查找的字符串 - Replacement : 用于替换 搜索字符串 的值

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 16. Replace 示例

表达式

值

${filename:replace('.', '_')}

a brand new filename_txt

${filename:replace(' ', '.')}

a.brand.new.filename.txt

${filename:replace('XYZ', 'ZZZ')}

a brand new filename.txt

${filename:replace('filename', 'book')}

a brand new book.txt

replaceFirst(替换首个)

描述:将主体中一个文本字符串或正则表达式的*第一个*出现替换为另一个字符串。

主体类型:字符串

参数:- Search String : The String (literal or regular expression pattern) to find within 主体 - Replacement : 用于替换 搜索字符串 的值

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 17. ReplaceFirst 示例

表达式

值

${filename:replaceFirst('a', 'the')}

the brand new filename.txt

${filename:replaceFirst('[br]', 'g')}

a grand new filename.txt

${filename:replaceFirst('XYZ', 'ZZZ')}

a brand new filename.txt

${filename:replaceFirst('\w{8}', 'book')}

a brand new book.txt

replaceAll(替换全部)

描述:replaceAll 函数接受两个字符串参数:一个字面字符串或正则表达式(Lynxus 使用 Java Pattern 语法),以及一个替换字符串。返回值是将主体中所有匹配正则表达式的模式替换为替换值字符串的结果。

主体类型:字符串

参数:- Regex : 要在主体中匹配的正则表达式(Java 语法) - Replacement : 用于替换主体中匹配项的值。如果正则表达式参数使用捕获组,则替换中允许使用反向引用。

返回类型:字符串

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 18. ReplaceAll 示例

表达式

值

${filename:replaceAll('\..*', '')}

a brand new filename

${filename:replaceAll('a brand (new)', '$1')}

new filename.txt

${filename:replaceAll('XYZ', 'ZZZ')}

a brand new filename.txt

${filename:replaceAll('brand (new)', 'somewhat $1')}

a somewhat new filename.txt

padLeft(左填充)

描述:padLeft 函数将给定的填充字符串(或 "_",如果未提供)前置到参数字符串,直到达到所需的长度。

如果参数的长度已经等于或大于所需长度,或者填充字符串为 null,或者所需长度为负数或大于 Integer.MAX_VALUE,则按原样返回参数。如果参数字符串不是有效属性,则返回 null。

主体类型:字符串

参数:- DesiredLength : 要填充到的整数值。 - PaddingString : 用于填充的可选字符串。如果未提供 PaddingString,将使用 "_"。如果 PaddingString 不是实际填充大小的精确倍数,它将被截断以适应 DesiredLength。

返回类型:字符串

示例:如果 "greetings" 属性的值为 "hello",则以下表达式将产生以下结果:

Table 19. PadLeft 示例

表达式

值

${greetings:padLeft(10)}

_____hello

${greetings:padLeft(10, '@')}

@@@@@hello

${greetings:padLeft(10, 'xy')}

xyxyxhello

${greetings:padLeft(10, 'aVeryLongPaddingString')}

aVeryhello

padRight(右填充)

描述:padRight 函数将给定的填充字符串(或 "_",如果未提供)追加到参数字符串,直到达到所需的长度。

如果参数的长度已经等于或大于所需长度,或者填充字符串为 null,或者所需长度为负数或大于 Integer.MAX_VALUE,则按原样返回参数。如果参数字符串不是有效属性,则返回 null。

主体类型:字符串

参数:- DesiredLength : 要填充到的整数值。 - PaddingString : 用于填充的可选字符串。如果未提供 PaddingString,将使用 "_"。如果 PaddingString 不是实际填充大小的精确倍数,它将被截断以适应 DesiredLength。

返回类型:字符串

示例:如果 "greetings" 属性的值为 "hello",则以下表达式将产生以下结果:

Table 20. PadRight 示例

表达式

值

${greetings:padRight(10)}

hello_____

${greetings:padRight(10, '@')}

hello@@@@@

${greetings:padRight(10, 'xy')}

helloxyxyx

${greetings:padRight(10, 'aVeryLongPaddingString')}

helloaVery

replaceNull(替换空值)

描述:replaceNull 函数在主体为 null 时返回参数。否则,返回主体。

主体类型:任意

参数:- Replacement : 在主体为 null 时返回的值。

返回类型:如果主体不为 null 则为主体类型;否则为参数类型

示例:如果属性 "filename" 的值为 "a brand new filename.txt" 且属性 "hello" 不存在,则表达式 ${filename:replaceNull('abc')} 将返回 "a brand new filename.txt",而 ${hello:replaceNull('abc')} 将返回 "abc"。

replaceEmpty(替换空串)

描述:replaceEmpty 函数在主体为 null 或主体仅包含空白字符(换行、回车、制表符、空格)时返回参数。否则,返回主体。

主体类型:字符串

参数:- Replacement : 在主体为 null 或空时返回的值。

返回类型:字符串

示例:如果属性 "filename" 的值为 "a brand new filename.txt" 且属性 "hello" 的值为 " ",则表达式 ${filename:replaceEmpty('abc')} 将返回 "a brand new filename.txt",而 ${hello:replaceEmpty('abc')} 将返回 "abc"。

length(长度)

描述:返回主体的长度

主体类型:字符串

参数:无参数

返回类型:数字

示例:如果属性 "filename" 的值为 "a brand new filename.txt" 且属性 "hello" 不存在,则表达式 ${filename:length()} 将返回 24。${hello:length()} 将返回 0。

evaluateELString( EL 字符串求值)

描述:此函数对变量值内的表达式语言进行求值。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果注册表变量之一名为 "query",其值为 "SELECT * FROM TABLE WHERE ID = ${id}", 且 "id" 字段的值来自 flowfile 属性(即 id=20), 则表达式 ${query:evaluateELString()} 将返回 SELECT * FROM TABLE WHERE ID = 20

repeat(重复)

描述:返回一个字符串,该字符串是主体在 min repeats 和 max repeats 之间随机重复的次数。如果未提供 max repeats,则将返回主体恰好重复 min repeats 次。

min repeats 和 max repeats 必须是正数,且 max repeats 大于或等于 min repeats。

如果 min repeats 或 max repeats 不是数字,此函数调用将导致错误。

主体类型:字符串

参数:- min repeats : 重复主体的最小次数(含),如果未提供 max repeats 则为恰好重复的次数。 - max repeats : 重复主体的最大次数(含)。

返回类型:字符串

示例:如果我们有一个名为 "str" 的属性,其值为 "abc", 则以下表达式将产生以下结果:

Table 21. Repeat 示例

表达式

值

${str:repeat(1)}

abc

${str:repeat(2)}

abcabc

${str:repeat(1,2)}

abc or abcabc (at random)

${str:repeat(${str:length()})}

abcabcabc

${str:repeat(1, ${str:length()})}

abc or abcabc or abcabcabc (at random)

replaceByPattern(按模式替换)

描述:根据提供的映射规则返回一个字符串,将主体替换为另一个字符串。如果主体未被映射规则覆盖,则返回主体。

主体类型:字符串

参数:

  • 映射规则 : 映射规则是一个 K:V 的逗号分隔列表,其中 K 可以是正则表达式,V 是在 K 匹配主体时返回的字符串。示例:'abc:xyz,foo:poo' 和 'att[0-4]:low_range,att[5-9]:high_range,.*:other'

返回类型:字符串

示例:如果我们有一个名为 "str" 的属性,其值为 "abc", 则以下表达式将产生以下结果:

Table 22. ReplaceByPattern 示例

表达式

值

${str:replaceByPattern('abc:xyz,foo:poo')}

xyz

${str:replaceByPattern('foo:poo')}

abc

${str:replaceByPattern('a.c:xyz,.*:foo')}

xyz

编码/解码函数

以下每个函数将根据给定数据格式的规则对字符串进行编码。

escapeJson(JSON 转义)

描述:此函数通过将字符转义来准备将主体插入 JSON 文档。该函数正确转义引号和控制字符(制表符、反斜杠、回车、换页等)。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 'He didn’t say, "Stop!"',则表达式 ${message:escapeJson()} 将返回 'He didn’t say, \"Stop!\"'

escapeXml(XML 转义)

描述:此函数通过将字符转义来准备将主体插入 XML 文档。该函数正确转义引号、撇号、和号、<、> 和控制字符。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:escapeXml()} 将返回 '"bread" & "butter"'

escapeCsv(CSV 转义)

描述:此函数通过使用 RFC 4180 中的规则将字符转义来准备将主体插入 CSV 文档。该函数正确转义引号,并在需要时用引号包围字符串。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 'But finally, she left',则表达式 ${message:escapeCsv()} 将返回 '"But finally, she left"'

escapeHtml3(HTML3 转义)

描述:此函数通过将字符转义来准备将主体插入 HTML 文档。仅支持 HTML 3.0 实体。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:escapeHtml3()} 将返回 '"bread" & "butter"'

escapeHtml4(HTML4 转义)

描述:此函数通过将字符转义来准备将主体插入 HTML 文档。支持所有已知的 HTML 4.0 实体。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:escapeHtml4()} 将返回 '"bread" & "butter"'

unescapeJson(JSON 反转义)

描述:此函数反转义字符串中发现的所有 JSON 字面量。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 'He didn’t say, \"Stop!\"', 则表达式 ${message:unescapeJson()} 将返回 'He didn’t say, "Stop!"'

unescapeXml(XML 反转义)

描述:此函数将包含 XML 实体转义的字符串反转义为包含对应实际 Unicode 字符的字符串。仅支持五个基本 XML 实体(gt、lt、quot、amp、apos)。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:unescapeXml()} 将返回 '"bread" & "butter"'

unescapeCsv(CSV 反转义)

描述:此函数根据 RFC 4180 的规则反转义来自 CSV 文档的字符串。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"But finally, she left"',则表达式 ${message:unescapeCsv()} 将返回 'But finally, she left'

unescapeHtml3(HTML3 反转义)

描述:此函数 unescapes a string containing HTML 3 entity to a string containing the 对应的实际 Unicode 字符。仅支持 HTML 3.0 实体。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:unescapeHtml3()} 将返回 '"bread" & "butter"'

unescapeHtml4(HTML4 反转义)

描述:此函数 unescapes a string containing HTML 4 entity to a string containing the 对应的实际 Unicode 字符。支持所有已知的 HTML 4.0 实体。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果 "message" 属性为 '"bread" & "butter"',则表达式 ${message:unescapeHtml4()} 将返回 '"bread" & "butter"'

urlEncode(URL 编码)

描述:返回主体的 URL 友好版本。例如,这在使用 属性值以指示网站的 URL。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:我们可以使用表达式 ${url:urlEncode()} 对名为 "url" 的属性进行 URL 编码。如果 "url" 属性的值为 "https://lynxus.acal.org.cn/some value with spaces",则此 表达式将返回 "https%3A%2F%2Flynxus.acal.org.cn%2Fsome+value+with+spaces"。

urlDecode(URL 解码)

描述:将主体的 URL 友好版本转换为可读形式。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果我们有一个名为 "url" 的 URL 编码属性,其值为 "https://lynxus.acal.org.cn/some%20value%20with%20spaces" 或 "https%3A%2F%2Flynxus.acal.org.cn%2Fsome+value+with+spaces",则表达式 ${url:urlDecode()} 将返回 "https://lynxus.acal.org.cn/some value with spaces"。

base64Encode(Base64 编码)

描述:返回 Base64 编码的字符串。这对于能够以 ASCII 形式传输二进制数据很有用。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:我们可以使用以下表达式对名为 "payload" 的属性进行 Base64 编码: ${payload:base64Encode()} 如果属性 payload 的值为 "admin:admin", 则表达式 ${payload:base64Encode()} 将返回 "YWRtaW46YWRtaW4="。

base64Decode(Base64 解码)

描述:反转给定字符串的 Base64 编码。

主体类型:字符串

参数:无参数

返回类型:字符串

示例:如果我们有一个名为 "payload" 的 Base64 编码属性,其值为 "YWRtaW46YWRtaW4=",则表达式 ${payload:base64Decode()} 将返回 "admin:admin"。

UUID3(UUID v3)

描述:返回基于命名空间和名称的类型 3(MD5 哈希)UUID。参数必须是有效的 UUID。

主体类型:字符串

参数:- namespace : 命名空间 UUID 标识符

返回类型:字符串

示例:如果我们有一个名为 "attr" 的属性,其值为 "string value",则表达式 ${attr:UUID3('b9e81de3-7047-4b5e-a822-8fff5b49f808')} 将返回 "bf0ea246-a177-3300-bd7e-d4c9e973dc6f"。

空参数或包含无效 UUID 的参数值会导致异常公告。

另请参阅:UUID()

UUID5(UUID v5)

描述:返回基于命名空间和名称的类型 5(SHA-1 哈希)UUID。参数必须是有效的 UUID。

主体类型:字符串

参数:- namespace : 命名空间 UUID 标识符

返回类型:字符串

示例:如果我们有一个名为 "attr" 的属性,其值为 "string value",则表达式 ${attr:UUID5('245b55a8-397d-4480-a41e-16603c8cf9ad')} 将返回 "4d111477-5100-5f2d-ae79-b38bbe15aa78"。

空参数或包含无效 UUID 的参数值会导致异常公告。

另请参阅:UUID()

hash(哈希)

描述:使用提供的哈希算法返回十六进制编码的字符串。这可用于生成唯一密钥。

主体类型:字符串

参数:- algorithm : 用于哈希值的算法。 支持 [SHA-384, SHA-224, SHA-256, MD2, SHA, SHA-512, MD5] 之一。警告:MD2、MD5 和 SHA (SHA-1) 不应被视为密码学安全算法 (https://csrc.nist.gov/projects/hash-functions/nist-policy-on-hash-functions)。

返回类型:字符串

示例:我们可以使用以下表达式对名为 "payload" 的属性进行哈希处理: ${payload:hash('SHA-256')} 如果属性 payload 的值为 "string value", 则表达式 ${payload:hash('SHA-256')} 将返回 "9b6a1a9167a5caf3f5948413faa89e0ec0de89e12bef55327442e60dcc0e8c9b"。

搜索

Each of 以下 functions 用于 search its subject for some value.

startsWith(开头匹配)

描述:如果主体以参数提供的字符串开头,则返回 true, false 否则.

主体类型:字符串

参数:- value : 要搜索的值

返回类型:布尔

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则表达式 ${filename:startsWith("a brand")} 将返回 true. ${filename:startsWith("A BRAND")} 将 返回 false. ${filename:toUpper():startsWith('A BRAND')} 返回 true.

endsWith(结尾匹配)

描述:如果主体以参数提供的字符串结尾,则返回 true, false 否则.

主体类型:字符串

参数:- value : 要搜索的值

返回类型:布尔

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则表达式 ${filename:endsWith("txt")} 将返回 true. ${filename:endsWith("TXT")} 将 返回 false. ${filename:toUpper():endsWith('TXT')} 返回 true.

contains(包含)

描述:如果主体的值中包含参数的值,则返回 true。

主体类型:字符串

参数:- value : 要搜索的值

返回类型:布尔

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则表达式 ${filename:contains("new")} 将返回 true. ${filename:contains("NEW")} 将 返回 false. ${filename:toUpper():contains('NEW')} 返回 true.

in(在集合中)

描述:如果主体与提供的参数之一匹配,则返回 true。

主体类型:字符串

参数:- value1 : 第一个可能的匹配值 - valueN : 第 N 个可能的匹配值

返回类型:布尔

示例:如果 "myEnum" 属性的值为 "JOHN",则表达式 ${myEnum:in("PAUL", "JOHN", "MIKE")} 将返回 true. ${myEnum:in("RED", "GREEN", "BLUE")} 将 返回 false.

find(查找)

描述:如果主体包含与参数提供的正则表达式匹配的字符序列,则返回 true。

主体类型:字符串

参数:- Regex : 要匹配主体的正则表达式(Java Pattern 语法)

返回类型:布尔

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 23. find 示例

表达式

值

${filename:find('a [Bb]rand [Nn]ew')}

true

${filename:find('Brand.*')}

false

${filename:find('brand')}

true

matches(匹配)

描述:如果主体完全匹配参数提供的正则表达式,则返回 true。

主体类型:字符串

参数:- Regex : 要匹配主体的正则表达式(Java Pattern 语法)

返回类型:布尔

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 24. matches 示例

表达式

值

${filename:matches('a.*txt')}

true

${filename:matches('brand')}

false

${filename:matches('.brand.')}

true

indexOf(首次出现位置)

描述:返回主体中与作为参数提供的字符串值匹配的第一个字符的索引。如果在主体中多次找到参数,则返回首次出现的起始索引。如果在主体中找不到参数,则返回 -1。索引从零开始。这意味着如果搜索字符串在主体开头找到,返回值将为 0,而不是 1。

主体类型:字符串

参数:- value : 要在主体中搜索的值

返回类型:数字

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 25. indexOf 示例

表达式

值

${filename:indexOf('a.*txt')}

-1

${filename:indexOf('.')}

20

${filename:indexOf('a')}

0

${filename:indexOf(' ')}

1

lastIndexOf(最后出现位置)

描述:返回主体中与作为参数提供的字符串值匹配的最后一个字符的索引。如果在主体中多次找到参数,则返回最后出现的起始索引。如果在主体中找不到参数,则返回 -1。索引从零开始。这意味着如果搜索字符串在主体开头找到,返回值将为 0,而不是 1。

主体类型:字符串

参数:- value : 要在主体中搜索的值

返回类型:数字

示例:如果 "filename" 属性的值为 "a brand new filename.txt",则以下表达式将产生以下结果:

Table 26. lastIndexOf 示例

表达式

值

${filename:lastIndexOf('a.*txt')}

-1

${filename:lastIndexOf('.')}

20

${filename:lastIndexOf('a')}

17

${filename:lastIndexOf(' ')}

11

jsonPath(JSON 路径查询)

描述:jsonPath 函数通过将主体作为 JSON 求值并应用 JSON 路径表达式来生成字符串。如果主体不包含有效的 JSON、jsonPath 无效或路径 在主体中不存在,将返回空值。如果求值结果为标量值,则生成标量值的字符串表示。 否则生成 JSON 结果的字符串表示。长度为 1 的 JSON 数组是特殊情况: 当 [0] 是标量时,生成 [0] 的字符串表示。

主体类型:字符串

参数:jsonPath : 用于解析主体的 JSON 路径表达式。

返回类型:字符串

示例:如果 "myJson" 属性为

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}
Table 27. jsonPath 示例

表达式

值

${myJson:jsonPath('$.firstName')}

John

${myJson:jsonPath('$.address.postalCode')}

10021-3100

${myJson:jsonPath('$.phoneNumbers[?(@.type=="home")].number')}

212 555-1234

${myJson:jsonPath('$.phoneNumbers')}

[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]

${myJson:jsonPath('$.missing-path')}

empty

${myJson:jsonPath('$.bad-json-path..')}

exception bulletin

空主体值或包含无效 JSON 文档的主体值会导致异常公告。

jsonPathDelete(JSON 路径删除)

描述:jsonPathDelete 函数从主体 JSON 中删除指定的 JsonPath,并以字符串形式 返回更新后的 JSON。

主体类型:字符串

参数:jsonPath : 用于从主体中删除的 JSON 路径表达式。

返回类型:字符串

示例:如果 "myJson" 属性为

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [],
  "spouse": null
}
Table 28. jsonPathDelete 示例

表达式

值

${myJson:jsonPathDelete('$.firstName')}

{"lastName":"Smith","age":25,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]}

${myJson:jsonPathDelete('$.missing-path')}

Returns original JSON document

空主体值或包含无效 JSON 文档的主体值会导致异常公告。

jsonPathAdd(JSON 路径添加)

描述:jsonPathAdd 函数在主体 JSON 的指定 JsonPath 处向数组添加一个标量值,并以字符串形式 返回更新后的 JSON。 如果表达式目标元素是非数组,将返回空字符串并记录指示错误的异常。如果表达式目标元素路径不在 JSON 中,操作将返回原始 JSON 而不做任何修改。

主体类型:字符串

参数:- jsonPath : 用于在主体上设置值的 JSON 路径表达式。 - value : 要添加到主体指定路径的数组中的值表达式。

返回类型:字符串

示例:如果 "myJson" 属性为

{
     "firstName": "John",
     "lastName": "Smith",
     "age": 25,
     "voter" : true,
     "height" : 6.1,
     "address" : {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021-3100"
     },
     "phoneNumbers": [
         {
             "type": "home",
             "number": "212 555-1234"
         },
         {
             "type": "office",
             "number": "646 555-4567"
         }
     ],
     "nicknames" : []
 }
Table 29. jsonPathAdd 示例

表达式

值

${myJson:jsonPathAdd('$.nicknames', 'Jimmy')}

{"firstName":"James", lastName":"Smith", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}],"nicknames":["Jimmy"]}

${myJson:jsonPathAdd('$.missingpath', 'Jimmy')}

Returns original JSON document with no modifications

${myJson:jsonPathAdd('$.firstName', 'Jimmy')}

empty

jsonPathSet(JSON 路径设置)

描述:jsonPathSet 函数在主体 JSON 的指定 JsonPath 处设置值,并以字符串形式 返回更新后的 JSON。

主体类型:字符串

参数:- jsonPath : 用于在主体上设置值的 JSON 路径表达式。 - value : 要在主体指定路径上设置的值表达式。

返回类型:字符串

示例:如果 "myJson" 属性为

{
     "firstName": "John",
     "lastName": "Smith",
     "age": 25,
     "voter" : true,
     "height" : 6.1,
     "address" : {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021-3100"
     },
     "phoneNumbers": [
         {
             "type": "home",
             "number": "212 555-1234"
         },
         {
             "type": "office",
             "number": "646 555-4567"
         }
     ],
     "nicknames" : []
 }
Table 30. jsonPathSet 示例

表达式

值

${myJson:jsonPathSet('$.firstName', 'James')}

{"firstName":"James", lastName":"Smith", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}]}

${myJson:jsonPathSet('$.missingpath', 'James')}

Returns original JSON document

空主体值或包含无效 JSON 文档的主体值会导致异常公告。

jsonPathPut(JSON 路径放入)

描述:jsonPathPut 函数在主体 JSON 的指定 JsonPath 处放置键和标量值,并以字符串形式 返回更新后的 JSON。

主体类型:字符串

参数:- jsonPath : 用于在主体上设置值的 JSON 路径表达式。 - value : 要在主体指定路径上设置的值表达式。 - key : 键表达式及其在主体指定路径处关联的值。

返回类型:字符串

示例:如果 "myJson" 属性为

{
     "firstName": "John",
     "lastName": "Smith",
     "age": 25,
     "voter" : true,
     "height" : 6.1,
     "address" : {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021-3100"
     },
     "phoneNumbers": [
         {
             "type": "home",
             "number": "212 555-1234"
         },
         {
             "type": "office",
             "number": "646 555-4567"
         }
     ],
     "nicknames" : []
 }
Table 31. jsonPathPut 示例

表达式

值

${myJson:jsonPathPut('$','middlename','Turon')}

{"firstName":"James", lastName":"Smith", "middlename": "Turon", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}]}

空主体值或包含无效 JSON 文档的主体值会导致异常公告。

数学运算与数值操作

对于支持小数和数字(整数)类型的函数,返回值类型取决于输入类型。如果subject or argument 是 Decimal then 结果 将 a Decimal. If both values are Numbers then 结果 将 a Number. This includes除法。这是为了保持向后兼容性并避免强制舍入误差。

plus(加)

描述:将一个数值加到主体上。如果参数或主体无法被 转换为数字,则返回 null。不提供溢出处理。

主体类型:Number or Decimal

参数:- Operand : 要加到主体的值

返回类型:Number or Decimal (depending on input types)

示例:如果 "fileSize" 属性的值为 100,则表达式 ${fileSize:plus(1000)} 将返回 值 1100.

minus(减)

描述:从主体中减去一个数值。不提供溢出处理。

主体类型:Number or Decimal

参数:- Operand : 要从主体减去的值

返回类型:Number or Decimal (depending on input types)

示例:如果 "fileSize" 属性的值为 100,则表达式 ${fileSize:minus(100)} 将返回 值 0.

multiply(乘)

描述:将数值乘以主体并返回乘积。 不提供溢出处理。

主体类型:Number or Decimal

参数:- Operand : 要乘以主体的值

返回类型:Number or Decimal (depending on input types)

示例:如果 "fileSize" 属性的值为 100,则表达式 ${fileSize:multiply(1024)} 将返回 值 102400.

divide(除)

描述:将主体除以一个数值并返回结果。

主体类型:Number or Decimal

参数:- Operand : 要除以主体的值

返回类型:Number or Decimal (depending on input types)

示例:如果 "fileSize" 属性的值为 100,则表达式 ${fileSize:divide(12)} 将返回 值 8.

mod(取模)

描述:对主体执行关于参数的模除法。即,此函数将主体除以参数的值并返回余数而非商。

主体类型:Number or Decimal

参数:- Operand : 要除以主体的值

返回类型:Number or Decimal (depending on input types)

示例:如果 "fileSize" 属性的值为 100,则表达式 ${fileSize:mod(12)} 将返回 值 4.

toRadix(进制转换)

描述:将主体从十进制数转换为不同的进制(或数字基数)。可选的第二个参数可用于指定最小字符数。如果转换后的值字符数少于该数量,数字将用前导零填充。如果传入的是小数作为主体,它将先被转换为整数然后再处理。

主体类型:数字

参数:- Desired Base : 2 到 36 之间的数字(包含) - Padding : 可选参数,指定转换输出中的最小字符数

返回类型:字符串

示例:如果 "fileSize" 属性的值为 1024,则以下表达式将产生 以下结果:

Table 32. toRadix 示例

表达式

值

${fileSize:toRadix(10)}

1024

${fileSize:toRadix(10, 1)}

1024

${fileSize:toRadix(10, 8)}

00001024

${fileSize:toRadix(16)}

400

${fileSize:toRadix(16, 8)}

00000400

${fileSize:toRadix(2)}

10000000000

${fileSize:toRadix(2, 16)}

0000010000000000

fromRadix(从进制转换)

描述:将主体从指定的基数(或数字进制)转换为以十为底的整数。主体将按原样转换,不进行解释,所有字符必须对该进制有效。例如,从十六进制转换 "0xFF" 将不会成功,因为 "x" 是无效的十六进制字符。如果传入十进制数作为主体,它将首先被转换为整数,然后进行处理。

主体类型:字符串

参数:- Subject Base : 2 到 36 之间的数字(包含)

返回类型:数字

示例:如果 "fileSize" 属性的值为 1234A,则以下表达式将产生 以下结果:

Table 33. toRadix 示例

表达式

值

${fileSize:fromRadix(11)}

17720

${fileSize:fromRadix(16)}

74570

${fileSize:fromRadix(20)}

177290

random(随机数)

描述:使用不安全的随机数生成器返回一个随机整数(0 到 2^63 - 1)。

主体类型:No subject

参数:无参数

返回类型:数字

示例:${random():mod(10):plus(1)} 返回 random number between 1 and 10 inclusive.

math(数学运算)

描述:高级功能。此表达式仅供高级用户使用。它利用 Java 反射来运行任意 java.lang.Math 静态方法。确切的 API 将取决于version of Java you are running. The Java API can be found here: https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Math.html
为了运行正确的方法,参数类型必须正确。表达式语言的"数字"(整数)类型被解释为 Java 的 "long"。"小数"类型被解释为 Java 的 "double". Running the desired method may require calling "toNumber()" or "toDecimal()" 为了 "cast" 值 to the desired type. Th是一个lso is important to remember when cascading "math()" calls since the 返回 type depends on the method that was run.

主体类型:无主体、数字或小数(取决于要运行的方法)

参数:- Method : 要运行的 Java Math 方法的名称 - Optional Argument : 作为方法的第二个参数的可选参数。

返回类型:数字或小数(取决于运行的方法)

示例:- ${math("random")} 运行 Math.random()。

  • ${literal(2):toDecimal:math("pow", 2.5)} 运行 Math.pow(2D,2.5D)。

  • ${literal(64):toDecimal():math("cbrt"):toNumber():math("max", 5)} 运行 Math.maxDouble.valueOf(Math.cbrt(64D).longValue(), 5L)。请注意需要 toDecimal(),因为 "cbrt" 接受 "double" 作为输入,而 "64" 会被解释为 long。"toDecimal()" 调用对于正确调用该方法是必要的。"toNumber()" 调用也是必要的,因为 "cbrt" 返回 double,而 "max" 方法的参数必须是相同类型,而 "5" 被解释为 long。

  • ${literal(5.4):math("scalb", 2)} 运行 Math.scalb(5.4, 2)。这个示例很重要,因为 Lynxus EL 将所有整数视为 "long" 类型,没有 "int" 的概念。"scalb" 的第二个参数是 "int" 类型,且没有重载接受 long,因此没有特殊类型处理就无法运行。在找不到使用 "double" 和 "long" 类型参数的 Java 方法时,"math()" EL 函数将尝试查找同名但参数为 "double" 和 "int" 的 Java 方法。

  • ${first:toDecimal():math("pow", ${second:toDecimal()})},其中属性计算结果为 "first" = 2.5,"second" = 2。此示例运行 Math.pow(2.5D, 2D)。显式调用 toDecimal() 很重要,因为 EL 具有动态特性。在创建流程时,用户不知道表达式语言的值是否能被解释为整数。在此示例中,如果没有显式调用 "toDecimal","math" 函数将尝试运行参数类型为 "double" 和 "long" 的 Java 方法 "pow"(该方法不存在)。

日期操作

format(格式化)

描述:根据参数指定的格式将数字格式化为日期/时间。参数必须是有效的 Java DateTimeFormatter 格式的字符串。主体预期为一个数字,表示自 1970 年 1 月 1 日 GMT 午夜以来的毫秒数。数字将使用本地时区进行求值,除非在第二个可选参数中指定。

主体类型:数字

参数:- format : 要使用的 Java DateTimeFormatter 语法格式 - time zone : 可选参数,指定要使用的时区(Java TimeZone 语法)

返回类型:字符串

示例:如果属性 "time" 的值为 "1420058163264",则以下表达式将产生以下结果:

Table 34. format 示例

表达式

值

${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}

2014/12/31 20:36:03.264Z

${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "America/Los_Angeles")}

2014/12/31 12:36:03.264Z

${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "Asia/Tokyo")}

2015/01/01 05:36:03.264Z

${time:format("yyyy/MM/dd", "GMT")}

2014/12/31

${time:format("HH:mm:ss.SSS'Z'", "GMT")}

20:36:03.264Z

${time:format("yyyy", "GMT")}

2014

formatInstant(格式化时刻)

描述:[.description]#根据参数指定的格式格式化 Instant、数字或字符串。

第一个参数必须是有效的 Java DateTimeFormatter 格式的字符串。第二个参数必须是有效的时区字符串。主体预期为 Instant、String 或 Number,表示自 1970 年 1 月 1 日 GMT 午夜以来的毫秒数,或具有以下

DateTimeFormatter 语法:#

  • ISO_OFFSET such as '2011-12-03T10:15:30+01:00'

  • ISO_INSTANT such as '2011-12-03T10:15:30Z'

  • RFC_1123 such as 'Thu, 01 Dec 1994 16:00:00 GMT'

主体类型:Instant or Number or String

参数:- format : 要使用的 Java DateTimeFormatter 语法格式 - time zone : 可选参数,指定要使用的时区(Java TimeZone 语法)

返回类型:字符串

示例:如果属性 "time" 的值为 "1647884009479",timeIsoOffset 的值为 "2022-12-03T10:15:30+01:00", timeIsoInstant 的值为 "2022-12-03T10:15:30Z","timeRFC1123" 的值为 "Thu, 01 Dec 2022 16:00:00 GMT",则以下表达式将产生以下结果:

Table 35. format 示例

表达式

值

${time:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}

2022/03/21 17:33:29.479Z

${timeIsoOffset:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "Asia/Tokyo")}

2022/12/03 18:15:30.000Z

${timeIsoInstant:formatInstant("yyyy/MM/dd", "Asia/Tokyo")}

2022/12/03 19:15:30.000Z

${timeRFC1123:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}

2022/12/01 16:00:00.000Z

toDate(转日期)

描述:根据参数指定的格式将字符串转换为日期数据类型。参数 必须 a String that 是一个 valid Java DateTimeFormatter syntax. 主体 is expected to be a String that is formatted 按照参数格式化。日期将使用本地时区进行求值,除非在第二个可选参数中指定。

主体类型:字符串

参数:- format : 解析主体时使用的当前格式,采用 Java DateTimeFormatter 语法。 - time zone : 可选参数,指定解析主体时使用的时区,采用 Java TimeZone 语法。

返回类型:日期

示例:如果属性 "year" 的值为 "2014",属性 "time" 的值为 "2014/12/31 15:36:03.264Z", 则表达式 ${year:toDate('yyyy', 'GMT')} 将返回一个日期数据类型,其值代表 2014 年 1 月 1 日 GMT 午夜。 表达式 ${time:toDate("yyyy/MM/dd HH:mm:ss.SSS’Z'", "GMT")} 将返回一个日期数据类型,代表 2014 年 12 月 31 日 GMT 15:36:03.264。

通常,此函数与 format(格式化) 函数结合使用以更改日期/时间的格式。例如,如果属性 "date" 的值为 "12-24-2014",我们想将格式更改为 "2014/12/24",可以通过链接两个函数来实现:${date:toDate('MM-dd-yyyy'):format('yyyy/MM/dd')}。

toInstant(转时刻)

描述:根据参数指定的格式将字符串或数字转换为时刻(Instant)数据类型。支持字符串格式的纳秒精度日期解析。参数必须是有效的 Java DateTimeFormatter 语法的字符串。主体预期为按照参数格式化的字符串或表示毫秒级日期时间的数字。日期时间将使用第二个参数中指定的时区进行求值。

主体类型:String or Number

参数:- format : 解析主体时使用的当前格式,采用 Java DateTimeFormatter 语法。 - time zone : 必需参数,指定解析主体时使用的时区,采用 Java TimeZone 语法。

返回类型:Instant

示例:如果属性 "time" 的值为 "2014/12/31 15:36:03.264Z",则表达式 ${time:toInstant("yyyy/MM/dd HH:mm:ss.SSS’Z'", "GMT")} 将返回一个时刻数据类型,代表 2014 年 12 月 31 日 GMT 15:36:03.264。

通常,此函数与 formatInstant(格式化时刻) 函数结合使用以更改日期/时间的格式。例如,如果属性 "dateTime" 的值为 "12-24-2014 12:06:59",我们想将格式更改为 "2014/12/24",可以通过链接两个函数来实现:${dateTime:toInstant('MM-dd-yyyy HH:mm:ss', 'GMT'):formatInstant('yyyy/MM/dd', 'GMT')}。

toMicros(转微秒)

描述:将时刻主体转换为微秒精度的数字

主体类型:Instant

参数:无参数

返回类型:数字

示例:如果 "dateTime" 属性的值为 "2022/03/18 10:22:27.678234567",则表达式 ${dateTime:toInstant('yyyy/MM/dd HH:mm:ss.SSSSSSSSS', 'America/New_York'):toMicros()} 将属性的时刻值转换为自纪元以来的 1647613347678234 微秒。

toNanos(转纳秒)

描述:将时刻主体转换为纳秒精度的数字

主体类型:Instant

参数:无参数

返回类型:数字

示例:如果 "dateTime" 属性的值为 "2022/03/18 10:22:27.678234567",则表达式 ${dateTime:toInstant('yyyy/MM/dd HH:mm:ss.SSSSSSSSS', 'America/New_York'):toNanos()} 将属性的时刻值转换为自纪元以来的 1647613347678234567 纳秒。

plusDuration(加时长)

描述:使用人类可读的表达式(如 "1 week" 或 "3 months")向日期值添加指定的时间量。月份和年份调整遵循日历规则。

如果主体为 null,则函数返回 null。

主体类型:日期

参数:- amount : 形式为 "<number> <unit>" 的字符串。数字和单位之间需要有空格。 - timezone(可选):时区 ID 字符串(例如 "America/New_York"、"Europe/Vienna")。提供时,日历单位算术(天、周、月、年)在指定的时区中执行,以便挂钟时间在夏令时边界保持不变。省略时,使用 JVM 系统默认时区。

支持的单位:nanosecond(s)、second(s)、minute(s)、hour(s)、day(s)、week(s)、month(s)、year(s)

单位不区分大小写。

注意:纳秒被接受但对 Date 主体没有影响,因为 java.util.Date 具有毫秒精度。如果需要纳秒精度,请使用 plusInstantDuration。

返回类型:日期

示例:如果 "date" 属性的值为 "04-08-2026"(2026 年 8 月 4 日),则以下表达式将产生以下结果:

Table 36. plusDuration Examples

表达式

值

${date:toDate('dd-MM-yyyy'):plusDuration('1 week'):format('dd-MM-yyyy')}

11-08-2026

${date:toDate('dd-MM-yyyy'):plusDuration('2 years'):format('dd-MM-yyyy')}

04-08-2028

${date:toDate('dd-MM-yyyy'):plusDuration('3 months'):format('dd-MM-yyyy')}

04-11-2026

${date:toDate('dd-MM-yyyy'):plusDuration('2 hours'):format('dd-MM-yyyy HH:mm:ss')}

04-08-2026 02:00:00

${date:toDate('dd-MM-yyyy'):plusDuration('1 day')}

Returns 纪元 milliseconds for 结果ing Date.

${date:toDate('yyyy-MM-dd HH:mm:ss', 'Europe/Vienna'):plusDuration('1 day', 'Europe/Vienna'):format('yyyy-MM-dd HH:mm:ssXXX', 'Europe/Vienna')} (where date = "2026-03-29 00:00:00")

2026-03-30 00:00:00+02:00 (DST-aware: wall-clock time preserved across spring-forward)

Table 37. Calendar-Aware Behavior

Scenario

Example

Result

Month-end clamping

Jan 31 + 1 month

Feb 28 (or Feb 29 in a leap year)

Leap year clamping

Feb 29, 2024 + 1 year

Feb 28, 2025

Crossing a day boundary

Aug 4 00:00:00 + 25 hours

Aug 5 01:00:00

DST spring-forward (with timezone)

Mar 29 00:00:00 CET + 1 day (Europe/Vienna)

Mar 30 00:00:00 CEST

minusDuration(减时长)

描述:使用人类可读的表达式(如 `"1 week"\` 或 `"3 months"\`)从日期值中减去指定的时间量。月份和年份的调整遵循日历规则。

If 主体 is null, the function 返回 null.

主体类型:日期

参数:- amount : A string in the form "<number> <unit>". A space between 数字 and unit is required. - timezone (optional) : A timezone ID string (e.g. "America/New_York", "Europe/Vienna"). When provided, calendar-unit arithmetic (days, weeks, months, years) is performed in 指定的 timezone 以便 wall-clock time is preserved across DST boundaries. When omitted, the JVM system default timezone is used.

支持的单位:nanosecond(s)、second(s)、minute(s)、hour(s)、day(s)、week(s)、month(s)、year(s)

单位不区分大小写。

注意:纳秒被接受但对 Date 主体没有影响,因为 java.util.Date 具有毫秒精度。如果需要纳秒精度,请使用 minusInstantDuration。

返回类型:日期

示例:如果 "date" 属性的值为 "04-08-2026"(2026 年 8 月 4 日),则以下表达式将产生以下值:

Table 38. minusDuration 示例

表达式

值

${date:toDate('dd-MM-yyyy'):minusDuration('1 month'):format('dd-MM-yyyy')}

04-07-2026

${date:toDate('dd-MM-yyyy'):minusDuration('2 weeks'):format('dd-MM-yyyy')}

21-07-2026

${date:toDate('dd-MM-yyyy'):minusDuration('1 year'):format('dd-MM-yyyy')}

04-08-2025

${date:toDate('dd-MM-yyyy'):minusDuration('1 second'):format('dd-MM-yyyy HH:mm:ss')}

03-08-2026 23:59:59

${date:toDate('dd-MM-yyyy'):minusDuration('1 day')}

返回结果日期的纪元毫秒数。

${date:toDate('yyyy-MM-dd HH:mm:ss', 'America/New_York'):minusDuration('1 day', 'America/New_York'):format('yyyy-MM-dd HH:mm:ssXXX', 'America/New_York')}(其中 date = "2026-11-02 00:00:00")

2026-11-01 00:00:00-04:00(DST 感知:在夏令时回拨时保留挂钟时间)

Table 39. 日历感知行为

场景

示例

结果

月末钳制

Mar 31 - 1 month

Feb 28(闰年为 Feb 29)

闰年钳制

Feb 29, 2024 - 1 year

Feb 28, 2023

跨越日边界

Aug 4 00:00:00 - 1 second

Aug 3 23:59:59

DST 回拨(带时区)

Nov 2 00:00:00 EDT - 1 day (America/New_York)

Nov 1 00:00:00 EDT

plusInstantDuration(时刻加时长)

描述:使用人类可读的表达式(如 `"1 week"\` 或 `"3 months"\`)向时刻值添加指定的时间量。算术运算在 UTC 中求值。

如果主体为 null,则函数返回 null。

主体类型:Instant

参数:- amount : 形式为 "<number> <unit>" 的字符串。数字和单位之间需要有空格。