Apache NiFi Expression Language

概覽

NiFi主要的功能是數(shù)據(jù)處理和數(shù)據(jù)分發(fā)舞虱,在NiFi中數(shù)據(jù)均抽象為FlowFile泵琳。FlowFile有兩個部分組成:內(nèi)容(Content)和屬性(attribute)。這里Content是實際上要處理和分發(fā)的數(shù)據(jù)琳轿,而FlowFile并不直接存儲數(shù)據(jù)而是存儲了一個指向?qū)嶋H存儲地址的指針。屬性(attribute)是數(shù)據(jù)本身相關(guān)的元數(shù)據(jù)在孝,描述信息等,形式是一組鍵值對淮摔。例如:“GetFile Processor”從本地磁盤中讀取文件浑玛,則文件內(nèi)容將成為FlowFile的內(nèi)容,則屬性可能為文件名噩咪、文件目錄顾彰、文件大小极阅、最后修改時間、讀寫權(quán)限等涨享。FlowFile的屬性使我們在不需要讀取數(shù)據(jù)內(nèi)容的情況下筋搏,能夠完成很多數(shù)據(jù)處理操作。NiFi引入Expression Language就是為了使用戶能夠方便的訪問FlowFile的屬性厕隧,對它們進行引用奔脐、比較、賦值等操作吁讨。如果使用過其他表達式語言例如:spring el或者jsp el,那么掌握NiFi el將非常容易髓迎。如果有開發(fā)經(jīng)驗,掌握NiFi el也非常容易建丧。

NiFi 表達式的結(jié)構(gòu)

NiFi 表達式語言總是以界定符${開始排龄,并以界定符}結(jié)束。在界定符之間的文本就是表達式本身翎朱。最基本的形式是表達式只包含一個屬性名稱橄维,例如:表達式${filename}將返回“filename”屬性的值。

稍復(fù)雜的形勢拴曲,可以調(diào)用一個函數(shù)對值進行處理再返回争舞。例如:$ {filename:toUpper()} , 調(diào)用filename的toUpper函數(shù),返回的是filename屬性值的全大寫形勢澈灼。有編程經(jīng)驗的同學(xué)應(yīng)該非常容易理解竞川,這相當于在java代碼“filename.toUpper();”,或者python代碼的“filename.upper()”。我們拆解一下這個表達式:

  1. 調(diào)用方法使用的界定符是“:”

  2. 函數(shù)名稱“toUpper”

  3. 函數(shù)的參數(shù)列表開始界定符"("

  4. 參數(shù)列表叁熔,這個例子里沒有

  5. 函數(shù)的參數(shù)列表開始界定符")",這里也表示函數(shù)調(diào)用結(jié)束了委乌。

NiFi el語言提供了很多的函數(shù)(這里基本對應(yīng)了java的各種函數(shù)),用于應(yīng)對各種各樣的需求者疤。例如操作字符串的toUpper(轉(zhuǎn)大些)福澡、equals(比較)叠赦、matches(正則匹配)等功能驹马,另外還提供了豐富的數(shù)學(xué)計算和時間、日期操作函數(shù)除秀。我們在一個屬性上執(zhí)行函數(shù)時糯累,將這個屬性稱為函數(shù)的“subject”,因為函數(shù)是在屬性實體上運行的册踩。

?這里可以類比java函數(shù)調(diào)用泳姐。函數(shù)的調(diào)用時依賴于一個對象的,通常是object.xxx();在nifi里屬性就是這個object暂吉。

鏈式調(diào)用

在NiFi el中胖秒,可以鏈式調(diào)用函數(shù)缎患,形式是這樣的${filename:toUpper():equals('HELLO.TXT')}。在這個例子中“filename”是toUpper的“subject”阎肝,toUpper的返回值是equals的“subject”挤渔。鏈接在一起調(diào)用的功能函數(shù)的數(shù)量沒有限制。

這里必須明確每個函數(shù)返回值的類型风题,因為返回值類型決定了下一個步能夠使用什么函數(shù)判导。filename是一個字符串,能夠使用字符串處理的函數(shù)toUpper, toUpper函數(shù)返回的也是字符串沛硅,能夠繼續(xù)是用字符串比較函數(shù)equals眼刃,equals函數(shù)返回的是一個boolean,這是就不能再調(diào)用字符串函數(shù)了摇肌,只能調(diào)用Boolean類型的函數(shù)擂红。

字符轉(zhuǎn)義

任何FlowFile的屬性都可以被NiFi el引用。但是如果屬性名稱包含特殊字符朦蕴,則必須對該屬性名稱進行轉(zhuǎn)義篮条。NiFi el定義的特殊字符有:

  • $ (dollar sign)

  • | (pipe)

  • { (open brace)

  • } (close brace)

  • ( (open parenthesis)

  • ) (close parenthesis)

  • [ (open bracket)

  • ] (close bracket)

  • , (comma)

  • : (colon)

  • ; (semicolon)

  • / (forward slash)

    • (asterisk)
  • ' (single quote)

  • (space)

  • \t (tab)

  • \r (carriage return)

  • \n (new-line)

此外,如果屬性名稱的第一個字符是數(shù)字吩抓,則它也被視為"特殊字符"涉茧。如果屬性名稱中存在特殊字符,則需要將屬性名稱至于雙引號或者單引號之間疹娶。在NiFi el中雙引號和單引號有等同的作用伴栓,可以互換使用。例如:一個屬性名稱“my attribute”中有空格雨饺,則在使用中應(yīng)該轉(zhuǎn)義钳垮,而使用${“my attribute”}${my attribute'}這兩種形式都是對的。

在本例中额港,要返回的值是“my attribute”屬性的值(如果存在)饺窿。表達式語言將在一個層次結(jié)構(gòu)中搜索匹配的屬性。層次結(jié)構(gòu)在下文中詳細介紹移斩。

還有一些函數(shù)是沒有“subject”的肚医,類似于java的靜態(tài)函數(shù)沒有對象就能調(diào)用。這些函數(shù)需在表達式開始進行調(diào)用向瓷,例如${hostname()}肠套。這些功能也可以一起改變。例如猖任,${hostname():toUpper()}你稚。嘗試使用“subject”調(diào)用這些函數(shù)將導(dǎo)致錯誤。

嵌入式表達式

如果需要比較兩個不同屬性的值,可以通過嵌入式表達式來實現(xiàn)這一點刁赖。例如搁痛,檢查“filename”屬性是否與“uuid”屬性相同:${filename:equals( ${uuid})}。**特別注意宇弛,在“equals”函數(shù)的左括號和嵌入表達式之間有一個空格落追,這不影響表達式的計算,它的目的是使表達式更易于閱讀涯肩。分隔符之間的空白會被el忽略轿钠。因此,我們可以使用表達式${ filename : equals(${ uuid}) }${filename:equals(${uuid})} 病苗,這兩個表達式的意思是一樣的疗垛。但是屬性名之間的空格是不會被忽略的,而且必須轉(zhuǎn)義硫朦。

屬性搜索層級

當NiFi el引用了一個屬性名稱時贷腕,NiFi都會去哪里搜索這個屬性?

  1. 當前FlowFile的屬性

  2. 搜索Process Group的變量

  3. 搜索File Registry file

  4. 搜索NiFi JVM的屬性

  5. 搜索操作系統(tǒng)環(huán)境變量

NiFi由上到下逐一搜索咬展,發(fā)現(xiàn)匹配的屬性或者變量立即返回泽裳。如果沒有搜索到則返回一個“null”。

el的使用

在NiFi應(yīng)用程序中破婆,el大量用于配置處理器屬性涮总,但是并非所有處理器屬性都支持le。屬性是否支持el祷舀,是由“Processor"的開發(fā)人員在編寫處理器時決定瀑梗。NiFi為每個屬性清楚地標命了el是否被支持。

在NiFi配置組件屬性時裳扯,用戶界面在屬性名稱旁邊提供一個信息圖標([圖片上傳失敗...(image-fec500-1606195078087)] )抛丽。將鼠標懸停在該圖標上,將提供一個提示饰豺,其中提供有關(guān)屬性的有用信息亿鲜。此信息包括屬性的描述、默認值(如果有)冤吨、歷史配置的值(如果有)以及表達式語言的此屬性的計算范圍蒿柳。有三個值,表達式語言的求值范圍是分層的:NONE(不支持) → VARIABLE_REGISTRY(變量注冊表)→ FLOWFILE_ATTRIBUTES(FlowFile屬性)锅很。

  • None:此屬性不支持使用el記性配置其馏。

  • VARIABLE_REGISTRY: 按層次結(jié)構(gòu)構(gòu)造如下:

    • 在"Process Group"級別定義的變量凤跑,然后遞歸地向上到更高的"Process Group"爆安,直到根"Process Group"。

    • 在自定義屬性文件(NiFi.properties)中通過nifi.variable.registry.properties注冊的屬性仔引。

    • 在JVM級別定義的環(huán)境變量和系統(tǒng)屬性扔仓。

  • FLOWFILE_ATTRIBUTES-將使用當前FlowFile的屬性褐奥,以及變量注冊表定義的變量。

轉(zhuǎn)義

在NiFi EL中${}被賦予特別的意義翘簇,因此如果Processor屬性中要使用這個兩個標記作為文本意義時則需要進行轉(zhuǎn)義撬码。例如,用戶可能希望將屬性值配置為文本Hello${UserName}版保,NiFi會將這段文本識別為EL表達式呜笑,這時候就需要使用轉(zhuǎn)義,即添加一個額外的美元符號$彻犁,使用Hello$${UserName}叫胁。轉(zhuǎn)義本身比較簡單,但是容易被忽略汞幢,而造成困擾驼鹅,需要小心應(yīng)對。

如果在{之前連續(xù)遇到兩個以上的$字符森篷,則每對$字符都將被視為$字符的轉(zhuǎn)義输钩。從左到右執(zhí)行轉(zhuǎn)義。為了幫助說明這一點仲智,請考慮變量“abc”包含值“xyz”买乃。然后,考慮下表中的表達式及其相應(yīng)的求值:

表達式 返回值 說明
${abc} xyz
$${abc} ${abc} $$,第一個符為轉(zhuǎn)義符號钓辆,第二個被轉(zhuǎn)義
$$${abc} $xyz
$$$${abc} $${abc}
$$$$${abc} $$xyz
I owe you $5 I owe you $5 沒有el表達式
You owe me $$5 too You owe me $$5 too $字符沒有轉(zhuǎn)義为牍,因為它不在el表達式前面。
Unescaped $$${5 because no closing brace Unescaped $$${5 because no closing brace 因為這里沒有右大括號岩馍,所以沒有實際的el表達式碉咆,因此$字符沒有轉(zhuǎn)義。
Unescaped $$${5} because no closing brace <Error> 此表達式無效蛀恩,因為前兩個美元符($$)因為轉(zhuǎn)義在文本上等于一個美元()疫铜,后跟“{5}”,而“{5}”不是有效表達式双谆。數(shù)字必須轉(zhuǎn)義壳咕。正確的使用形式應(yīng)該為“{‘5’}”
Unescaped $$${'5'} because no closing brace Unescaped $ because no closing brace {'5'}因為沒有名為“5”的屬性,因此表達式的計算結(jié)果為空字符串顽馋∥嚼澹“$$”的計算結(jié)果是單個(轉(zhuǎn)義的)`',因為它緊跟在表達式前面寸谜。

表達式語言編輯器

配置“Processor”屬性的值時竟稳,NiFi用戶界面使用表達式語言編輯器提供有關(guān)表達式語言的幫助。一旦一個表達式以${開始,編輯器就開始突出顯示括號和大括號他爸,這樣用戶就可以很容易地分辨出哪個左括號或大括號與哪個右括號或大括號匹配聂宾。

編輯器還提供了上下文相關(guān)的幫助,它提供了可以在當前光標位置使用的所有函數(shù)的列表诊笤。要激活此功能系谐,請按鍵盤上的Ctrl+Space(注意操作系統(tǒng)快捷鍵沖突)。用戶還可以鍵入函數(shù)名的一部分讨跟,然后按Ctrl+Space查看所有可以使用的以相同前綴開頭的函數(shù)纪他。例如,如果我們在編輯器中輸入${filename:to然后按Ctrl+Space晾匠,會彈出一個彈出窗口止喷,其中列出了六個不同的函數(shù):“toDate”、“toLower”混聊、“toNumber”弹谁、“toRadix”、“toString”和“toUpper”句喜。然后预愤,我們可以繼續(xù)鍵入以縮小顯示的函數(shù),也可以通過用鼠標雙擊列表中的一個函數(shù)或使用箭頭鍵突出顯示所需的函數(shù)并按Enter鍵從列表中選擇一個函數(shù)咳胃。

函數(shù)

函數(shù)提供了一種操作和比較屬性值的方法植康。表達式語言提供了許多不同的函數(shù)來滿足自動化數(shù)據(jù)流程的需要。每個函數(shù)接受零個或多個參數(shù)并返回一個值展懈。然后可以將這些函數(shù)鏈接在一起销睁,以創(chuàng)建強大的表達式來計算條件和操作值。

數(shù)據(jù)類型

函數(shù)的每個參數(shù)和從函數(shù)返回的每個值都有特定的數(shù)據(jù)類型存崖。表達式語言支持四種不同的數(shù)據(jù)類型:

  • String:字符串是一系列字符冻记,可以由數(shù)字、字母来惧、空格和特殊字符組成冗栗。

  • Number(整數(shù)): 數(shù)字是由一個或多個數(shù)字組成的整數(shù)(09)。從日期數(shù)據(jù)類型轉(zhuǎn)換為數(shù)字時供搀,它們表示為自1970年1月1日格林尼治標準時間午夜以來的毫秒數(shù)隅居。

  • Decimal: Decimal是一個可以支持小數(shù)和更大值的數(shù)值,精度損失最小葛虐。更準確地說胎源,它是一個雙精度64位IEEE 754(浮點數(shù)運算標準) 浮點。由于有精度損失屿脐,因此不應(yīng)將此數(shù)據(jù)類型用于非常精確的值涕蚤,例如貨幣宪卿。以下是表達式語言支持的文字小數(shù)形式的一些示例(“E”也可以是小寫):

    • 1.1

    • .1E1

    • 1.11E-12

  • Date:

  • 期是保存日期和時間的對象。利用日期操縱類型強制函數(shù)此數(shù)據(jù)類型可以轉(zhuǎn)換為字符串和數(shù)字赞季。如果整個表達式語言表達式的計算結(jié)果為日期,則它將轉(zhuǎn)換為格式為“<Day of Week><Month><Day of Month><Hour>:<Minute>:<Second><Time Zone><Year>”的字符串奢驯。在Java SimpleDateFormat格式中也表示為“E MMM dd HH:mm:ss z yyyy”申钩。例如:“2016年12月31日星期三12:00:04 UTC”。

  • Boolean: 布爾值是“true”或“false”之一瘪阁。

在計算表達式語言函數(shù)之后撒遣,所有屬性都存儲為類型字符串。

表達式語言一般能夠自動進行類型轉(zhuǎn)化管跺,但是也存在一些函數(shù)需要進行強制轉(zhuǎn)換义黎。

數(shù)字和十進制類型支持十六進制值,但在解釋為文本時豁跑,必須用“0x”加引號和前綴廉涕。例如,這兩個表達式是有效的(如果沒有引號或“0x”艇拍,表達式將無法正常運行):

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

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

布爾邏輯

表達式語言夠?qū)傩灾蹬c其他值進行比較狐蜕。例如,這通常用于配置“Processor”應(yīng)如何路由數(shù)據(jù)卸夕。以下函數(shù)用于執(zhí)行布爾邏輯层释,例如比較兩個值。這些函數(shù)中的每一個都是為處理Boolean類型的值而設(shè)計的快集。

isNull

判斷值是否為空贡羔。為空返回"true",不為空返回“false”

例子: ${filename:isNull()} 返回 true 如果"filename" 屬性不存在 ,返回 false 如果屬性存在个初。

notNull

“notNull”函數(shù)返回“isNull”函數(shù)的相反值乖寒。也就是說,如果主題存在院溺,它將返回“true”宵统,否則返回“false”。

例子: ${filename:notNull()}

isEmpty

如果Subject為null覆获、不包含任何字符或只包含空白(換行马澈、回車、空格弄息、制表符)痊班,則“isEmpty”函數(shù)返回“true”;否則返回“false”.

例子: ${filename:isEmpty()} 返回 true 如果“filename”屬性為空或者只包含空白字符摹量, 否則返回“false”

equals

“equals”函數(shù)使用非常廣泛涤伐,它可以確定其主題是否等于另一個字符串值馒胆。注意,equals函數(shù)執(zhí)行兩個字符串值的直接比較凝果,另外一個比較函數(shù)“matches”是使用正則表達式進行匹配祝迂。

例子: 通過使用表達式${filename:equals("hello.txt")},我們可以檢查FlowFile的文件名是否為“hello.txt“器净,型雳,或者可以檢查屬性“hello”的值是否等于“filename”屬性的值:${hello:equals( ${filename} )}

equalsIgnoreCase

描述: 與“equals”函數(shù)類似,“equalsIgnoreCase”函數(shù)忽略大小寫山害。

例子: ${filename:equalsIgnoreCase('hello.txt')}

gt

描述: “gt”函數(shù)用于數(shù)值比較纠俭,如果主題大于參數(shù)寒匙,則返回“true”灶轰。如果不能將主語或參數(shù)強制轉(zhuǎn)換為數(shù)字,則此函數(shù)返回“false”歇终。

例子: ${fileSize:gt( 1024 )} 如果"filesize"大于1024返回“true”权纤,否則返回"false".

ge

描述: 描述: “ge”函數(shù)用于數(shù)值比較钓简,如果主題大于等于參數(shù),則返回“true”汹想,否則返回"false"涌庭。如果不能將主語或參數(shù)強制轉(zhuǎn)換為數(shù)字,則此函數(shù)返回“false”欧宜。

例子: ${fileSize:ge( 1024 )} 如果"filesize"大于或正等于1024返回“true”坐榆,否則返回"false".

lt

描述: “l(fā)t”函數(shù)用于數(shù)值比較,如果主題小于參數(shù)冗茸,則返回“true”席镀,否則返回"false"。如果不能將主語或參數(shù)強制轉(zhuǎn)換為數(shù)字夏漱,則此函數(shù)返回“false”豪诲。

例子: ${fileSize:lt( 1048576 )} 如果"filesize"小于1048576返回“true”,否則返回"false".

le

描述: “l(fā)e”函數(shù)用于數(shù)值比較挂绰,如果主題小于或等于參數(shù)屎篱,則返回“true”,否則返回"false"葵蒂。如果不能將主語或參數(shù)強制轉(zhuǎn)換為數(shù)字交播,則此函數(shù)返回“false”。

例子: ${fileSize:le( 1048576 )} 如果"filesize"小于等于1048576返回“true”践付,否則返回"false".

and

and的主題是boolean型秦士,參數(shù)也是boolean型,當主題和參數(shù)都為“true”,則返回"true",其他情況全返回"false"

Expression Value
${bool:ifElse('a','b')} a
${literal(true):ifElse('a','b')} a
${nullFilename:isNull():ifElse('file does not exist', 'located file')} file does not exist
${nullFilename:ifElse('found', 'not_found')} not_found
${filename:ifElse('found', 'not_found')} not_found
${filename:isNull():not():ifElse('found', 'not_found')} found

字符串操作

toUpper

返回字符串的大寫永高。

toLower

返回字符串的小寫隧土。

trim

去掉首尾的空白字符提针。

substring

返回字符串的一部分,兩個參數(shù)開始位置(包含)和結(jié)束位置(不包含)曹傀。
例子:
如果屬性"filename"的值為"a brand new filename.txt"則一下表達式成立:

Expression Value
${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

接收一個字符串型的參數(shù)辐脖。在subject中由左至右匹配參數(shù)字符串,如果過匹配到皆愉,返回匹配位置左側(cè)的子串嗜价。
例子: "filename" => "a brand new filename.txt":

Expression Value
${filename:substringBefore('.')} a brand new filename
${filename:substringBefore(' ')} a
${filename:substringBefore(' n')} a brand
${filename:substringBefore('missing')} a brand new filename.txt

substringBeforeLast

接收一個字符串型的參數(shù)。在subject中由右至左匹配參數(shù)字符串亥啦,如果過匹配到炭剪,返回匹配位置左側(cè)的子串练链。
例子: "filename" => "a brand new filename.txt"翔脱,

Expression Value
${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

接收一個字符串型的參數(shù)。在subject中由左至右匹配參數(shù)字符串媒鼓,如果過匹配到届吁,返回匹配位置右側(cè)的子串。
例子: "filename" => "a brand new filename.txt"绿鸣,

Expression Value
${filename:substringAfter('.')} txt
${filename:substringAfter(' ')} brand new filename.txt
${filename:substringAfter(' n')} ew filename.txt
${filename:substringAfter('missing')} a brand new filename.txt

substringAfterLast

接收一個字符串型的參數(shù)疚沐。在subject中由右至左匹配參數(shù)字符串,如果過匹配到潮模,返回匹配位置右側(cè)側(cè)的子串亮蛔。
例子: "filename" => "a brand new filename.txt":

Expression Value
${filename:substringAfterLast('.')} txt
${filename:substringAfterLast(' ')} filename.txt
${filename:substringAfterLast(' n')} ew filename.txt
${filename:substringAfterLast('missing')} a brand new filename.txt

getDelimitedField

使用分隔符將subject分成若干字段,并返回其中指定的字段擎厢。

參數(shù):

  • 字段索引究流,指定返回第幾個字段,注意索引是由1開始的动遭,要區(qū)別于數(shù)組索引芬探。
  • 分割符,默認是“,”厘惦。
  • 引用字符 : 引用字符范圍內(nèi)的分割符將會被忽略偷仿。
  • 轉(zhuǎn)義字符,轉(zhuǎn)義后的分割符將失去分割作用宵蕉。默認為“\”酝静。
  • 刪除字符(bool),是否刪除轉(zhuǎn)義字符和引用字符羡玛。如果在處理過程中遇到轉(zhuǎn)移字符或引用字符形入,此字符將被刪除。

返回值: String

例子:

  • "line" => "Jacobson, John", 32, Mr.

  • "altLine" => Jacobson, John|32|Mr.

    Expression Value
    ${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

    append

接收一個字符串參數(shù)缝左,將參數(shù)追加到主題(subject)之后然后返回亿遂。

例子: "filename" => "a brand new filename.txt", 則表達式 ${filename:append('.gz')} 返回 "a brand new filename.txt.gz".

prepend

接收一個字符串參數(shù)浓若,將主題追加到參數(shù)之后然后返回。

例子: "filename" => "a brand new filename.txt", 則表達式 ${filename:prepend('a brand new ')} 返回 "a brand new filename.txt".

replace

替換字符串蛇数,接收兩個參數(shù)挪钓,第一個參數(shù)查找并被的字符串,第二個參數(shù)替換字符串耳舅。

例子: "filename" => "a brand new filename.txt",

Expression Value
${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

替換字符串碌上,但是只替換找到的第一個字符串。
例子: "filename" => "a brand new filename.txt",

Expression Value
${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函數(shù)接收兩個字符串參數(shù):一個文本字符串或正則表達式(NiFi使用Java模式語法)和一個替換字符串浦徊。返回值是用替換字符串替換主題中與正則表達式匹配的所有模式的結(jié)果馏予。

例子: "filename" => "a brand new filename.txt",

Expression Value
${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”函數(shù)將給定的填充字符串(默認為“_”)添加到參數(shù)“subject”左側(cè),直到達到指定長度盔性。

以下兩種情況不執(zhí)行填充:

  • subject的長度已經(jīng)等于或大于指定長度
  • 指定的長度為負數(shù)霞丧,或者大于Integer.MAX

如果參數(shù)字符串不是有效屬性,則返回“null”冕香。

例子: "greetings" => "hello",

Expression Value
${greetings:padLeft(10)} _____hello
${greetings:padLeft(10, '@')} @@@@@hello
${greetings:padLeft(10, 'xy')} xyxyxhello
${greetings:padLeft(10, 'aVeryLongPaddingString')} aVeryhello

padRight

“padLeft”函數(shù)將給定的填充字符串(默認為“_”)添加到參數(shù)“subject”右側(cè)蛹尝,直到達到指定長度。

以下兩種情況不執(zhí)行填充:

  • subject的長度已經(jīng)等于或大于指定長度
  • 指定的長度為負數(shù)悉尾,或者大于Integer.MAX

如果參數(shù)字符串不是有效屬性突那,則返回“null”。

例子: "greetings" => "hello",

Expression Value
${greetings:padRight(10)} hello_____
${greetings:padRight(10, '@')} hello@@@@@
${greetings:padRight(10, 'xy')} helloxyxyx
${greetings:padLeft(10, 'aVeryLongPaddingString')} helloaVery

replaceNull

接收一個參數(shù)构眯,如果主題不存在則返回參數(shù)值愕难,如果主題存在則返回主題屬性值。

例子: "filename" => "a brand new filename.txt" , "hello" 不存在, 則表達式 ${filename:replaceNull('abc')} 返回 "a brand new filename.txt", 而${hello:replaceNull('abc')}` 返回 "abc".

replaceEmpty

接收一個參數(shù)惫霸,如果主題不存在或者主題屬性值只包含空字符串則返回參數(shù)值猫缭,否則返回主題屬性值。

例子: "filename" => "a brand new filename.txt" 它褪、"hello" => " ", 則表達式 ${filename:replaceEmpty('abc')} 返回 "a brand new filename.txt", 而${hello:replaceEmpty('abc')}` 返回 "abc".

length

返回subject的長度.

例子: "filename" => "a brand new filename.txt" , "hello" => null, ${filename:length()}返回 24. ${hello:length()} 返回 0.

evaluateELString

此函數(shù)用于計算變量值內(nèi)的表達式語言饵骨。
例子: "query" => "SELECT * FROM TABLE WHERE ID = {id}" 并且由flowfile的屬性中獲得id的值為20,則表達式 `{query:evaluateELString()}` 將返回“SELECT * FROM TABLE WHERE ID = 20”

repeat

返回一個字符串茫打,該字符串的主題在min repeatsmax repeats之間隨機重復(fù)多次居触。如果沒有提供max repeats,它將返回Subject repeated exactly min repeats次老赤。
min repeatsmax repeats必須是正數(shù)轮洋,max repeats大于或等于min repeats
如果min repeatsmax repeats不是數(shù)字,則此函數(shù)調(diào)用將導(dǎo)致錯誤抬旺。

Expression Value
${str:repeat(1)} abc
${str:repeat(2)} abcabc
${str:repeat(1,2)} abc or abcabc (at random)
${str:repeat( ${str:length()} )} abc or abcabc or abcabcabc (at random)

編碼/解碼函數(shù)

escapeJson

此函數(shù)通過使用JSON字符串規(guī)則轉(zhuǎn)義字符串中的字符來準備要插入到JSON文檔中的主題弊予。函數(shù)正確地轉(zhuǎn)義引號和控制字符(tab, backslash, cr, ff等)

例子: "message" => 'He didn’t say, "Stop!"', 則表達式 ${message:escapeJson()} 將返回 'He didn\u2019t say, "Stop!"'

escapeXml

此函數(shù)通過使用XML實體轉(zhuǎn)義字符串中的字符來準備要插入到XML文檔中的主題。函數(shù)正確地轉(zhuǎn)義引號开财、撇號汉柒、和號误褪、<,>和控制字符碾褂。

例子: "message" => '"bread" & "butter"',表達式 ${message:escapeXml()} 返回:

&quot;bread&quot; &amp; &quot;butter&quot; 

escapeCsv

此函數(shù)通過使用RFC 4180中的規(guī)則轉(zhuǎn)義字符串中的字符來準備要插入到CSV文檔中的主題兽间。如果需要,函數(shù)正確地轉(zhuǎn)義引號并將字符串括在引號中正塌。

例子: "message" => 'But finally, she left', 則表示 ${message:escapeCsv()} 返回 " 'But finally, she left'"

escapeHtml3

此函數(shù)通過使用HTML實體轉(zhuǎn)義字符串中的字符來準備要插入到HTML文檔中的主題嘀略。僅支持HTML3.0實體。

例子: "message" => '"bread" & "butter"', 則表達式${message:escapeHtml3()} 返回

 &quot;bread&quot; &amp; &quot;butter&quot; 

escapeHtml4

此函數(shù)通過使用HTML實體轉(zhuǎn)義字符串中的字符來準備要插入到HTML文檔中的主題乓诽。支持所有已知的HTML4.0實體

主題: String

參數(shù): 無

返回值: String

例子: "message" => '"bread" & "butter"', 則表達式${message:escapeHtml4()} 返回

 &quot;bread&quot; &amp; &quot;butter&quot; 

unescapeJson

描述: 此函數(shù)用于取消在字符串中找到的任何Json文本的轉(zhuǎn)義帜羊。

Expression Value
${filename:find('a [Bb]rand [Nn]ew')} true
${filename:find('Brand.*')} false
${filename:find('brand')} true

unescapeXml

此函數(shù)將包含XML實體轉(zhuǎn)義符的字符串取消轉(zhuǎn)義為包含與轉(zhuǎn)義符對應(yīng)的實際Unicode字符的字符串。僅支持五個基本XML實體(gt鸠天、lt讼育、quot、amp粮宛、apos)窥淆。

unescapeCsv

此函數(shù)根據(jù)RFC 4180的規(guī)則從CSV文檔中取消轉(zhuǎn)義字符串卖宠。

unescapeHtml3

此函數(shù)用于將包含HTML3實體的字符串轉(zhuǎn)換為包含與轉(zhuǎn)義符對應(yīng)的實際Unicode字符的字符串巍杈。僅支持HTML3.0實體。

unescapeHtml4

此函數(shù)用于將包含HTML4實體的字符串轉(zhuǎn)換為包含與轉(zhuǎn)義符對應(yīng)的實際Unicode字符的字符串扛伍。支持所有已知的HTML4.0實體筷畦。

urlEncode

返回主題的URL編碼。

例子: "url" => "https://nifi.apache.org/some value with spaces", 表達式${url:urlEncode()}返回"https%3A%2F%2Fnifi.apache.org%2Fsome+value+with+spaces".

urlDecode

返回主題url解碼的值刺洒。

例子: "url" => "https://nifi.apache.org/some%20value%20with%20spaces" 或者 "https%3A%2F%2Fnifi.apache.org%2Fsome+value+with+spaces", 則表達式 ${url:urlDecode()} 返回 "https://nifi.apache.org/some value with spaces".

base64Encode

對主題進行base64編碼

base64Decode

對主題進行base64解碼

UUID3

返回基于類型3(MD5哈希)命名空間名稱的UUID鳖宾。

hash

使用提供的哈希算法返回十六進制編碼的字符串。這可用于生成唯一密鑰逆航。

UUID5

返回基于類型5(SHA-1 hashed)命名空間名稱的UUID鼎文。,算法可以選擇[SHA-384, SHA-224, SHA-256, MD2, SHA, SHA-512, MD5]

字符串搜索

用于搜索其主題以獲取某些值因俐。

startsWith

如果主題以參數(shù)提供的字符串開頭拇惋,則返回“true”;否則返回“false”抹剩。

endsWith

如果主題以參數(shù)提供的字符串結(jié)尾撑帖,則返回“true”;否則返回“false”澳眷。

contains

如果主題在任何位置包含參數(shù)的值胡嘿,則返回“true”。

in

接收多個參數(shù)钳踊,如果主題與提供的參數(shù)之一匹配衷敌,則返回“true”勿侯。

find

如果主題包含與參數(shù)提供的正則表達式匹配的任何字符序列,則返回“true”缴罗。

例子:"filename" => "a brand new filename.txt",

Expression Value
${filename:find('a [Bb]rand [Nn]ew')} true
${filename:find('Brand.*')} false
${filename:find('brand')} true

matches

如果主題與參數(shù)提供的正則表達式完全匹配罐监,則返回“true”。

例子:

"filename" => "a brand new filename.txt",

Expression Value
${filename:matches('a.*txt')} true
${filename:matches('brand')} false
${filename:matches('.brand.')} true

indexOf

返回與作為參數(shù)提供的字符串值匹配的主題中第一個字符的索引瞒爬。如果在Subject中多次找到該參數(shù)弓柱,則返回的值是第一次出現(xiàn)的起始索引。如果在主題中找不到參數(shù)侧但,則返回“-1”矢空。索引從零開始,如果在主題的開頭找到搜索字符串禀横,則返回的值將為“0”屁药,而不是“1”。

例子: "filename" => "a brand new filename.txt",

Expression Value
${filename:indexOf('a.*txt')} -1
${filename:indexOf('.')} 20
${filename:indexOf('a')} 0
${filename:indexOf(' ')} 1

lastIndexOf

返回與作為參數(shù)提供的字符串值匹配的主題中第一個字符的索引柏锄。如果在Subject中多次找到該參數(shù)酿箭,則返回的值是最后一次出現(xiàn)的起始索引。如果在主題中找不到參數(shù)趾娃,則返回“-1”缭嫡。索引從零開始,如果在主題的開頭找到搜索字符串抬闷,則返回的值將為“0”妇蛀,而不是“1”。

例子:"filename" => "a brand new filename.txt",

Expression Value
${filename:lastIndexOf('a.*txt')} -1
${filename:lastIndexOf('.')} 20
${filename:lastIndexOf('a')} 17
${filename:lastIndexOf(' ')} 11

jsonPath

“jsonPath”函數(shù)通過將主題計算為JSON并應(yīng)用JSON路徑表達式來生成字符串笤成。如果主題不包含有效的JSON评架、jsonPath無效或主題中不存在路徑,則生成空字符串炕泳。如果計算結(jié)果是標量值纵诞,則生成標量值的字符串表示形式。否則將生成JSON結(jié)果的字符串表示形式培遵。長度為1的JSON數(shù)組是特殊大小寫的浙芙,當“[0]”是標量時,生成“[0]”的字符串表示形式荤懂。

例子: "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
}
表達式 返回值
${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

jsonPathDelete

“jsonPathDelete”函數(shù)從主題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
}
Expression Value
${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

空的subject值或帶有無效JSON文檔的subject值將導(dǎo)致異常公告节仿。

jsonPathAdd

函數(shù)將標量值添加到主題JSON的指定JsonPath處的數(shù)組中晤锥,并返回更新后的JSON的字符串形式。如果expression目標元素是非數(shù)組,則返回一個空字符串矾瘾,并記錄一個指示錯誤的異常女轿。如果表達式目標元素路徑不在JSON中,則該操作返回原始JSON而不做任何修改壕翩。

例子: "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" : []
 }
Expression Value
${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

“jsonPathSet”函數(shù)在主題JSON的指定JsonPath處設(shè)置值蛉迹,并返回更新后的JSON的字符串形式。

例子: "myJson"的值如下

Expression Value
${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"}]}

jsonPathPut

“jsonPathPut”函數(shù)將鍵和標量值放在主題JSON的指定JsonPath處放妈,并返回更新后的JSON的字符串形式北救。

例子: "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" : []
 }
Expression Value
${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"}]}

空的subject值或帶有無效JSON文檔的subject值將導(dǎo)致異常公告。

數(shù)學(xué)計算與數(shù)字操作

對于那些支持Decimal和Number(整數(shù))類型的函數(shù)芜抒,返回值類型取決于輸入類型珍策。如果主語或參數(shù)是十進制,則結(jié)果將是十進制宅倒。如果兩個值都是數(shù)字攘宙,則結(jié)果將是數(shù)字,包括除法拐迁,這是為了保持向后兼容性蹭劈,而不是強制舍入錯誤。

plus

返回主題與參數(shù)相加的和线召。

minus

返回主題減去參數(shù)的差铺韧。

multiply

返回主題與參數(shù)相乘的積

divide

返回主題被參數(shù)除開的商。

mod

返回主題對參數(shù)取模(余數(shù))灶搜。

toRadix

將主語數(shù)字基數(shù)轉(zhuǎn)化祟蚀,即數(shù)字在不同進制間轉(zhuǎn)化工窍。第一個參數(shù)進制割卖,第二個參數(shù)顯示數(shù)位。

例子: "fileSize" =>1024

Expression Value
${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

將主語從指定的基數(shù)(或基數(shù))轉(zhuǎn)換為以10為基數(shù)的整數(shù)患雏。主題將按原樣轉(zhuǎn)換鹏溯,無需解釋,并且所有字符都必須對所轉(zhuǎn)換的基有效淹仑。例如丙挽,由于“x”是無效的十六進制字符,從十六進制轉(zhuǎn)換“0xFF”將不起作用匀借。如果一個十進制數(shù)作為主語傳遞颜阐,它將首先轉(zhuǎn)換為整數(shù),然后再進行處理吓肋。參數(shù)范圍為2~36凳怨。

例子: "fileSize" =>1234A

Expression Value
${fileSize:fromRadix(11)} 17720
${fileSize:fromRadix(16)} 74570
${fileSize:fromRadix(20)} 177290

random

返回一個隨機的整數(shù),范圍為0~2^63 - 1

math

高級功能。此表達式僅供高級用戶使用肤舞。它利用Java反射來運行任意java.lang.Math靜態(tài)方法紫新。確切的API將取決于您運行的Java版本。
為了運行正確的方法李剖,參數(shù)類型必須正確芒率。表達式語言“Number”(整數(shù))類型被解釋為Java“l(fā)ong”「菟常“Decimal”類型被解釋為Java“double”偶芍。運行所需的方法可能需要調(diào)用“toNumber()”或“toDecimal()”,以便將值“強制轉(zhuǎn)換”為所需的類型德玫。當級聯(lián)“math()”調(diào)用時腋寨,記住這一點也很重要,因為返回值依賴于運行的方法化焕。

例子:

  • ${math("random")} => Math.random().
  • ${literal(2):toDecimal:math("pow", 2.5)} => Math.pow(2D,2.5D).

日期操作

format

根據(jù)參數(shù)指定的格式將數(shù)字格式化為日期/時間萄窜。參數(shù)必須是有效的Java SimpleDateFormat格式的字符串。主題應(yīng)該是一個數(shù)字撒桨,表示自1970年1月1日格林尼治標準時間午夜以來的毫秒數(shù)查刻。除非在第二個可選選項中指定,否則將使用本地時區(qū)計算該數(shù)字參數(shù).函數(shù).

例子: "time" =>"1420058163264"

表達式 返回值
${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

toDate

將字符串根據(jù)指定格式轉(zhuǎn)化為日期凤类,第一個參數(shù)日期格式穗泵,第二個參數(shù)時區(qū)。

now

返回當前的時間谜疤,返回類型為Date佃延。

表達式 返回值
${now()} 表示當前日期和時間的日期類型,精確到毫秒
${now():toNumber()} 自1970年1月1日格林尼治標準時間午夜起的毫秒數(shù)(例如夷磕,1453843201123)
${now():toNumber():minus(86400000) 一個顯示24小時前時間的數(shù)字
${now():format(‘yyyy’)} 返回4位年
${now():toNumber():minus(86400000):format('E')} 昨天是星期幾履肃,用3個字母的縮寫(例如,“Wed”)

類型轉(zhuǎn)換

無主函數(shù)

表達式語言中的大多數(shù)函數(shù)是通過使用語法${屬性名:函數(shù)名(參數(shù)列表)}調(diào)用坐桩。有一些函數(shù)不包含主題尺棋,即屬性名不存在,則使用如下形式進行調(diào)用函數(shù)名(參數(shù)列表)},例如${ip()}`獲得機器的IP地址绵跷。本節(jié)中的所有函數(shù)沒有主題膘螟,直接進行調(diào)用。

ip

返回當前主機的ip地址碾局。

例子:獲取本機地址的方式為: ${ip()}.

hostname

返回當前主機名荆残。接受一個布爾型參數(shù),參數(shù)為“true”净当,返回一個完全限定的主機名内斯,參數(shù)為“false”,返回一個簡單主機名,參數(shù)默認值為“false”

例子: 返回完全限定主機名{hostname(true)} 嘿期, 返回簡單主機名{hostname(false)} 或 ${hostname()}品擎。

UUID

描述: 返回隨機生成的類型4 UUID。

例子: ${UUID()} 返回值類似于“305d54-75b4-431b-adb2-eb6b9e546013”

nextInt

返回一個整數(shù)备徐,在一個NiFi實例中連續(xù)調(diào)用理論上返回一個單調(diào)遞增整數(shù)序列(由0開始)萄传。此值不會在重啟后保持,也不能保證在集群中是唯一的蜜猾。這個計數(shù)器在所有NiFi組件之間共享秀菱,因此一個Processor連續(xù)調(diào)用不一定能得到連續(xù)的序列。

literal

將參數(shù)作為文本字符串值返回蹭睡。

例子: {literal(2):gt(1)} 返回 true衍菱,{literal( ${allMatchingAttributes('a.*'):count()} ):gt(3)},如果有三個以上的屬性名以“a”開頭則返回true肩豁。

getStateValue

通過傳入字符串鍵并將值作為字符串返回來訪問“processor”的狀態(tài)值脊串。這是一個特殊的表達式語言函數(shù),它只適用于顯式允許EL查詢狀態(tài)的“processor”清钥。目前只有UpdateAttribute可以琼锋。

例子: 如果“UpdateAttribute processor”曾經(jīng)在狀態(tài)中使用“count”鍵存儲了一個值“20” ,'${getStateValue("count")}返回20.

thread

返回"processor"在計算表達式時使用的線程的名稱祟昭。當使用具有多個并發(fā)任務(wù)的處理器并且需要某些數(shù)據(jù)唯一性時缕坎,這可能用得到。

例子: ${thread()} 返回值類似 Timer-Driven Process Thread-4.

多屬性求值

當有必要針對多個屬性相同的條件求值時篡悟,可以通過“and”和“or”函數(shù)來實現(xiàn)谜叹。如果屬性超過兩個,表達式將變得晦澀難懂搬葬、容易出錯荷腊,并且很難維護。出于這個原因踩萎,NiFi提供了幾個函數(shù)來同時針對屬性組相同的條件求值停局。

anyAttribute

檢查給定屬性是否與給定條件匹配。此函數(shù)沒有主語香府,它接受一個或多個參數(shù),這些參數(shù)是要應(yīng)用表達式其余部分的屬性的名稱码倦。如果指定的任何屬性在對表達式求值時返回值“true”企孩,則此函數(shù)將返回“true”。否則袁稽,此函數(shù)將返回“false”勿璃。相當于多個屬性分別求值再進行"或"計算。

例子: 有三對屬性:"abc"=> "hello world", "xyz" => "good bye world", "filename" => "file.txt"

表達式 返回值
${anyAttribute("abc", "xyz"):contains("bye")} true
${anyAttribute("filename","xyz"):toUpper():contains("e")} false

allAttributes

檢查所有給定屬性是否與給定條件匹配。此函數(shù)沒有主語补疑,它接受一個或多個參數(shù)歧沪,這些參數(shù)是要應(yīng)用表達式其余部分的屬性的名稱。如果在對表達式的其余部分求值時莲组,指定的所有屬性都返回值“true”诊胞,則此函數(shù)將返回“true”。否則锹杈,此函數(shù)將返回“false”撵孤。相當于多個屬性分別求值再進行或計算。相當于多個屬性分別求值再進行"與"計算竭望。

例子: 有三對屬性: "abc" => "hello world", "xyz" => "good bye world", "filename" => "file.txt" 邪码,

表達式 返回值
${allAttributes("abc", "xyz"):contains("world")} true
${allAttributes("abc", "filename","xyz"):toUpper():contains("e")} false

anyMatchingAttribute

檢查給定屬性是否與給定條件匹配。此函數(shù)沒有主語咬清,它接受一個或多個正則表達式參數(shù)以與屬性名匹配闭专。任何名稱與提供的正則表達式之一匹配的屬性都將根據(jù)表達式的其余部分進行計算。如果指定的任何屬性在對表達式的其余部分求值時返回值“true”旧烧,則此函數(shù)將返回“true”喻圃。否則,此函數(shù)將返回“false”粪滤。相當于多個屬性分別求值再進行或計算斧拍。相當于多個屬性(能夠與正則表達式相匹配)分別求值再進行"或"計算。

例子: 有三對屬性: "abc" => "hello world", "xyz" => "good bye world", "filename" => "file.txt" 杖小,

表達式 返回值
${anyMatchingAttribute("[ax].*"):contains('bye')} true
${anyMatchingAttribute(".*"):isNull()} false

allMatchingAttributes

檢查給定屬性中是否有任何與給定條件匹配肆汹。此函數(shù)沒有主語,它接受一個或多個正則表達式參數(shù)以與屬性名匹配予权。任何名稱與提供的正則表達式之一匹配的屬性都將根據(jù)表達式的其余部分進行計算昂勉。如果在對表達式的其余部分求值時,指定的所有屬性都返回值“true”扫腺,則此函數(shù)將返回“true”岗照。否則,此函數(shù)將返回“false”笆环。相當于多個屬性(能夠與正則表達式相匹配)分別求值再進行"與"計算攒至。

例子:有三對屬性: "abc" => "hello world", "xyz" => "good bye world", "filename" => "file.txt" 战惊,

表達式 返回值
${allMatchingAttributes("[ax].*"):contains("world")} true
${allMatchingAttributes(".*"):isNull()} false
${allMatchingAttributes("f.*"):count()} 1

anyDelineatedValue

根據(jù)提供的分隔符拆分字符串旬渠,然后根據(jù)表達式的其余部分計算每個值。如果表達式在對任何單個值求值時返回“true”整袁,則此函數(shù)返回“true”账忘。否則志膀,函數(shù)返回“false”熙宇。第一個參數(shù),被拆分的字符串溉浙。第二個參數(shù)烫止,分隔符。

例子: "number_list" =>"1,2,3,4,5", "word_list" =>"the,and,or,not"戳稽,

表達式 返回值
${anyDelineatedValue("${number_list}", ","):contains("5")} true
${anyDelineatedValue("this that and", ","):equals("${word_list}")} false

allDelineatedValues

根據(jù)提供的分隔符將字符串拆分馆蠕,然后根據(jù)表達式的其余部分計算每個值。如果表達式在對所有單個值求值時广鳍,在每種情況下都返回“true”荆几,則此函數(shù)返回“true”。否則赊时,函數(shù)返回“false”吨铸。第一個參數(shù),被拆分的字符串祖秒。第二個參數(shù)诞吱,分隔符。

例子: "number_list" =>"1,2,3,4,5", "word_list" =>"the,and,or,not"竭缝,

Expression Value
${allDelineatedValues("${word_list}", ","):contains("o")} true
${allDelineatedValues("${number_list}", ","):count()} 4
${allDelineatedValues("${number_list}", ","):matches("[0-9]+")} true
${allDelineatedValues("${word_list}", ","):matches('e')} false

join

用指定的分隔符連接多個值的聚合函數(shù)房维。此函數(shù)只能與“allAttributes”、“allMatchingAttributes”和“allresourcedvalues”函數(shù)一起使用抬纸。

例子: "abc" => "hello world", "xyz" => "good bye world", "filename" => "file.txt"咙俩,

表達式 返回值
${allMatchingAttributes("[ax].*"):substringBefore(" "):join("-")} hello-good
${allAttributes("abc", "xyz"):join(" now")} hello world nowgood bye world now

count

一個聚合函數(shù),用于統(tǒng)計“allAttributes”湿故、“allMatchingAttributes”和“allresourcedvalues”返回的非null阿趁、非false值的數(shù)量。此函數(shù)只能與“allAttributes”坛猪、“allMatchingAttributes”和“allresourcedvalues”函數(shù)一起使用脖阵。

例子: "abc" => "hello world", "xyz" => "good bye world", "number_list" => "1,2,3,4,5",

表達式 返回值
${allMatchingAttributes("[ax].*"):substringBefore(" "):count()} 2
${allAttributes("abc", "xyz"):contains("world"):count()} 1
${allDelineatedValues(${number_list}, ","):count()} 5
${allAttributes("abc", "non-existent-attr", "xyz"):count()} 2
${allMatchingAttributes(".*"):length():gt(10):count()} 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墅茉,一起剝皮案震驚了整個濱河市命黔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌就斤,老刑警劉巖悍募,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異战转,居然都是意外死亡搜立,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門槐秧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啄踊,“玉大人,你說我怎么就攤上這事刁标〉咄ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵膀懈,是天一觀的道長顿锰。 經(jīng)常有香客問我,道長启搂,這世上最難降的妖魔是什么硼控? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮胳赌,結(jié)果婚禮上牢撼,老公的妹妹穿的比我還像新娘。我一直安慰自己疑苫,他們只是感情好熏版,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捍掺,像睡著了一般撼短。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺勿,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天曲横,我揣著相機與錄音,去河邊找鬼不瓶。 笑死禾嫉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的湃番。 我是一名探鬼主播夭织,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吠撮!你這毒婦竟也來了尊惰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泥兰,失蹤者是張志新(化名)和其女友劉穎弄屡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞋诗,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡膀捷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了削彬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全庸。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秀仲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壶笼,到底是詐尸還是另有隱情神僵,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布覆劈,位于F島的核電站保礼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏责语。R本人自食惡果不足惜炮障,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坤候。 院中可真熱鬧胁赢,春花似錦、人聲如沸铐拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遍蟋。三九已至吹害,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虚青,已是汗流浹背它呀。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棒厘,地道東北人纵穿。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像奢人,于是被迫代替她去往敵國和親谓媒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容