117.5. Operator 支持


解析器仅限于只支持单个 Operator。

要启用它,必须将左侧值包括在 $\\{ } 中。语法为:

${leftValue} OP rightValue

其中 rightValue 可以是以 ' 'null、一个恒定值或其他包括在 $\{ } 中的其他表达式的字符串。

注意

运算符 必须 有空格。

Camel 将自动将 rightValue 类型转换为 leftValue 类型,例如它可以将一个字符串转换为一个数字,因此可以使用 > 来比较数字值。

支持以下 Operator:

Operator描述

==

等于

=~

等于忽略大小(在比较 String 值时忽略大小写)

>

大于

>=

大于 or equals

<

小于

小于 or equals

!=

not equals

!=~

不等于忽略大小(在比较 String 值时忽略大小写)

contains

如果包含基于字符串的值,则用于测试

!contains

如果基于字符串的值中没有包含测试

~~

在基于字符串的值中忽略大小敏感度,则用于测试

!~~

在基于字符串的值中忽略问题单敏感度,则用于测试

regex

对于与给定的正则表达式模式匹配,定义为 String 值

!regex

对于 不与作为 String 值定义的给定正则表达式模式匹配

in

要在一组值中匹配,每个元素必须用逗号分开。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,它是一组带有空值的四个值,然后是三个形形。

!in

若要匹配(如果没有在一组值中),则必须用逗号分隔每个元素。如果要包含空值,则必须使用双逗号(如 ',bronze,silver,gold' )定义它,它是一组带有空值的四个值,然后是三个形形。

is

如果左侧 type 是值的实例,则进行匹配。

!is

如果左侧类型不是值的实例,则进行匹配。

range

如果左手位于定义为数字( 从.. 到 ..)的值范围内, 则匹配。

!range

如果左手不在定义为数字( 从..到 .)的值范围之内, 则匹配。

startsWith

测试左侧字符串是否以右手字符串开头。

从开始

与 startsWith 运算符相同。

endwith

用于测试左侧字符串是否以右手字符串结尾。

结束

与 endWith 运算符相同。

也可以使用以下元运算符:

Operator描述

++

要按数字递增,请执行以下操作:左侧必须是函数,否则解析为 literal。

 — 

要减少一个数字,请执行以下操作:左侧必须是函数,否则解析为 literal。

\n

使用换行符。

\t

使用制表符。

\r

使用 carriage 返回字符。

\}

要将 } 字符用作文本。使用简单语言构建 JSon 结构时需要这样做。

以下逻辑运算符可用于对表达式进行分组:

Operator描述

&&

logical 和 运算符用于对两个表达式进行分组。

  
 

logical or 运算符用于对两个表达式进行分组。

AND 的语法是:

${leftValue} OP rightValue && ${leftValue} OP rightValue

OR 的语法是:

${leftValue} OP rightValue || ${leftValue} OP rightValue

一些示例:

// exact equals match
simple("${header.foo} == 'foo'")

// ignore case when comparing, so if the header has value FOO this will match
simple("${header.foo} =~ 'foo'")

// here Camel will type convert '100' into the type of header.bar and if it is an Integer '100' will also be converter to an Integer
simple("${header.bar} == '100'")

simple("${header.bar} == 100")

// 100 will be converter to the type of header.bar so we can do > comparison
simple("${header.bar} > 100")

117.5.1. 与不同类型的比较

当您与不同类型(如 String 和 int )进行比较时,您必须小心。Camel 将使用左侧的类型作为 1 个优先级。如果这两个值都无法根据该类型进行比较,并回退到右侧类型。
这意味着您可以利用值来强制执行特定类型的类型。假设上面的 bar 值是一个 String。然后您可以重新利用它:

simple("100 < ${header.bar}")

然后,确保 int 类型被用作 1st 优先级。

如果 Camel 团队将二进制比较操作改进,以基于 String 的首选数字类型,则这可能会改变。最常见的 String 类型会导致与数字比较时出现问题。

// testing for null
simple("${header.baz} == null")

// testing for not null
simple("${header.baz} != null")

另一个更高级的示例,其中右值是另一个表达式

simple("${header.date} == ${date:now:yyyyMMdd}")

simple("${header.type} == ${bean:orderService?method=getOrderType}")

另一个包含的示例,测试标题是否包含 Camel 一词

simple("${header.title} contains 'Camel'")

另外,带有 regex 的示例,测试数字标头是否为 4 位值:

simple("${header.number} regex '\\d{4}'")

最后是一个示例,如果标头等于列表中的任何值。每个元素必须用逗号分开,且不能空格分开。
这也适用于数字,因为 Camel 会将每个元素转换为左侧的类型。

simple("${header.type} in 'gold,silver'")

对于最后的 3,我们也支持使用 negate 测试:

simple("${header.type} !in 'gold,silver'")

您可以测试类型是否是一个特定实例,例如字符串

simple("${header.type} is 'java.lang.String'")

我们为所有 java.lang 类型添加了一个简写,以便您可以将其写入:

simple("${header.type} is 'String'")

也支持范围。范围间隔需要数字,以及 from 和 end 都包括。例如,要测试值介于 100 到 199 之间:

simple("${header.number} range 100..199")

请注意,我们在没有空格的范围内使用 ..。它基于与 Groovy 相同的语法。

simple("${header.number} range '100..199'")

因为 XML DSL 没有所有具有其各种构建器方法的 Java DSL 电源,所以您必须利用其他语言通过简单运算符进行测试。现在,您可以使用简单的语言进行此操作。在以下示例中,我们需要测试标头是否为小部件顺序:

<from uri="seda:orders">
   <filter>
       <simple>${header.type} == 'widget'</simple>
       <to uri="bean:orderService?method=handleWidget"/>
   </filter>
</from>

117.5.2. 使用 和 / 或

如果您有两个表达式,您可以将它们与 & amp;& 或 || 运算符合并。

例如:

simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")

此外,还支持 ||。这个示例为:

simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.