本主题介绍用于匹配消息响应器和 SQL 响应器工具中值的条件表达式。章节目录: 条件表达式是一个精确的语法,用于匹配以下内容中的值: 此条件表达式语法支持比较字符串和数字,也支持使用通配符和正则表达式匹配字符串。该语法适用于: Virtualize 根据响应器提供的输入值计算表达式。如果表达式返回 若要了解该语法及其实用性,请考虑一个简单的 SQL 响应器。将设 Virtualize 在记录数据库通讯报文时捕获到以下两个 SQL 查询: 这两个语句都与 SQL 响应器中以下 SQL 查询模板相对应: 使用所记录的数据,Virtualize 生成了一个查询模板,其参数条件如下表所示。感兴趣的是“yearCreated”和“category”列,它对应于 SQL 语句的 WHERE 子句中看到的值。 按照配置,SQL 响应器将只能返回 Virtualize 在录制期间捕获到的两个 SQL 语句的结果集。Virtualize 将参数条件配置为匹配记录期间看到的实际值。响应器没有 2005 年创建的“too-metal”小部件的结果集。也没有 2011 年创建的小部件的结果集(除了那些分类为“construction-molding”的小部件)。 您可以通过按小部件创建的年份对它们进行分组来实现这一点。关于 2008 年前创建的所有“tool-metal”小部件,您可以返回一个结果集。关于 2008 前期间或之后的所有“tool-metal”小部件,您可以返回另一个结果集(在录制过程中 Virtualize 捕获的结果集)。为此,可以对“yearCreated”参数使用数值比较。对于 2008 年前创建的小部件,您将需要手动添加另一个结果集到响应器。最后,您的参数条件表将如下所示: 注意“yearCreated”列中“category”为“tool-metal”行的条目。这两个条目都用方括号括起来,其表明不应将条目视为要匹配的字面字符串,而应将条目视为更复杂的条件表达式。括号中包含的表达式的计算结果为 在很多编程语言中,小于比较在小于运算符的两边都有值,如 除了 < 和 >=,条件表达式支持 <=, >, == (等号), 和 != (不等号)。可以使用相同的比较运算符对数字和字符串进行比较。 在参数标准表前两行中,"category" 值为 tool-metal。表达式 tool-metal 等价于表达式 [== "tool-metal"]。为了简洁起见,Virtualize 使用表达式作为字面量字符串进行匹配,除非表达式以 [ 字符开始。这样的副作用是,若要匹配以“[”开始的字面量字符串,则必须明确使用 == 运算符。若要匹配字面量字符串 "[xyz",则必须使用表达式 [== "[xyz"]。 除了可以用于数字和字符串的比较运算符之外,Virtualize 支持分析字符串的其他运算符。假设您想为 2011 年创建的所有小部件使用另一个结果集,其中的类别以“construction-”开头。为此,您可以向响应器添加另一个结果集,将表达式 [like "construction-*"] 用于“category”参数;这将匹配诸如 construction-support 和 construction-something-misc 之类的输入。类似运算符使用 * 和 ? 作为通配符。* 通配符匹配零个或多个字符。? 通配符只匹配一个字符。 假设您想仍然想为 2011 年创建的所有小部件使用另一个结果集,其中类别 "circuit" or "circuit-" 后跟着任意字符串,但不包括 "circuitbreaker" 之类的类别。为此,可以使用正则表达式向响应器添加另一个结果集,以匹配 "category" 参数。可以使用条件表达式 [=~ /^circuit(-.+)?$/]。正则表达式将匹配 circuit 或 circuit,其后面跟着 - 和一个或多个字符串,如 circuit-electric。 您的参数条件表现在看起来类似于: 假设始终希望 SQL 响应器为与您使用的查询模板匹配的任何 SQL 语句返回一个结果集。对于在 2000 年至 2007 年间创建的、没有与其他参数条件匹配的任何小部件,您都有一个结果集;对于任何其他不匹配的小部件,您都有一个最终的结果集。 若要匹配 2000 年至 2007 年间的“yearCreated”,您可以使用 and 运算符组合的两个数字比较。该表达式将匹配所需范围:[>= 2000 and <= 2007].这个 and 运算符组合两个条件表达式,并当且仅当两个表达式都返回 true 时返回 true。这个 or 运算符的工作原理类似,但当且仅当一个或两个表达式都返回 true 时返回 true。 若要匹配 "category" 参数的任何值,可以使用条件表达式 [*],其中匹配任何输入。或者,可以使用表达式 [],它意味着没有标准,因此通常计算为 true。Virtualize 支持 [*],因为它的意思更明显。注意,空表达式(其可能以空表单元格形式出现在参数条件表中)不匹配任何输入。相反,它匹配的输入是一个零长度的字符串。 最后,若要匹配任何其他不匹配的小部件,可以添加最终结果集作为标准表中最后一行,并在该行中对每个 "yearCreated" 和 "category" 参数使用表达式 [*]。 您的参数条件表现在看起来类似于: 虽然设置数据源关联性不同于配置 SQL 响应器,但 Virtualize 中的数据源关联性支持相同的条件表达式语法。 条件表达式可以解释为要匹配的字面量字符串,也可以解释为更复杂的表达式。 如果表达式没有以 [ 开始,Virtualize 将把表达式解释为要匹配的字面量字符串。以 [ 开始却没有以 ] 结尾的表达式无效:无法解析。方括号内包含的表达式支持针对输入值进行评估的多种运算符、多种比较运算符、使用 like 运算符和正则表达式的字符串模式匹配,以及用于组合条件表达式的布尔运算符。 Virtualize 根据输入值评估表达式,该输入值可以是一个数字也可以是一个字符串。每个条件评估结果为 Virtualize 支持多个比较运算符,您可以使用这些运算符来比较数字和字符串。所支持的运算符有: 例如,若要检查输入,将其假设为一个小于 57 的数字,则使用 [< 57]。输入值隐式地表示左操作数。右操作数是希望与之比较输入值的值。 字符串包含在双引号中。例如: 表达式 Virtualize 按词法比较字符串。例如, A < AA < Z < Zoo < a < aa < z < zoo。注意,此比较区分大小写。Virtualize 比较每个字符的 Unicode 值;如果两个字符串除了一个字符串较长外,其他都相同,则较短字符串小于较长字符串。 双引号内的字符串可以包含以下转义序列: Java 支持相同的转义序列。这个用于单引号字符的 \’ 转义序列是完全不必要的,但它提供了与 Java 字符串语法的兼容性。 数字和字符串的处理方式不同。表达式 [== "30"] 匹配输入字符串 30,但不匹配输入字符串 30.0。然而, [== 30] 同时匹配这两个字符串。右操作值和输入值具有一个类型:要么是数字,要么是字符串。如果两边都为数字,则 Virtualize 指定数值比较。如果其中一个操作数恰好是数字,则 Virtualize 将尝试把其他运算符转换为数字。如果成功,Virtualize 执行数值比较;如果没有成功,Virtualize 将操作数转换为字符串并执行字符串比较。 双引号的存在与否决定了右操作数是否是一个数字。SQL 响应器通过解析 SQL 语句决定输入值类型:SQL 语句中包含在单引号中的值是字符串;没有包含在单引号中的值是数字。在消息响应器的数据源关联性中,所有输入值都是字符串:若要进行数值比较,右操作数必须是数字。 下表中显示了如何使用比较运算符和匹配的输入值。 数字或字符串:55, 55.0 数字:55, 55.0 字符串:55 数字:60 字符串:55.0, 60 数字:56, 56.0, 3.1e24 数字:55, 55.0, 10 字符串:55, 050, 3.1e24, abc 为了进一步阐述语法,下表中显示了一些不可解析的表达式。 除了比较运算符外,您可以使用 like 运算符和正则表达式进行更复杂的字符串匹配。 like 运算符支持使用 [like alpha?beta*"] 形式的表达式的简单模式匹配。通配符 ? 匹配任何单个字符。通配符 * 匹配零个或多个字符。如果输入值是一个数字,则 Virtualize 将输入转为字符串。 正则表达式支持使用 [=~ /pat-tern/] 形式的表达式进行更强大的模式匹配。如果输入值是一个数字,则 Virtualize 将输入转为字符串。类似于 Perl,=~ 表示正则表达式比较,模式本身用斜线分隔。Virtualize 使用与 Java 正则表达式使用的相同模式语法。关于 Java 模式语法上完整的文档,请参阅 java.util.regex.Pattern 类的 Javadoc。与 Java 的模式语法不同的一点是,要匹配一个 / 字符必须使用反斜杠转义。 如果输入字符串的某个子字符串与模式匹配,则正则表达式比较返回 true。如果希望匹配 abc 而不是 abc123 或 123abc,则必须使用 [=~ /^abc$/] 代替 [=~ /abc/ ]。^ 和 $ 分别匹配字符串的开始和结尾。 下表展示了如何使用比较运算符和匹配的输入值。 Virtualize 支持使用 and 和 or 运算符组合条件表达式。例如,如果输入值介于 0 和 9 之间, [>= 0 and <= 9] 返回 and 运算符具有比 or 运算符更高的优先级。可以在表达式周围使用括号。表达式 [like "*b*" or like "*a*" and like "*z*"] 相当于 [like "*b*" or (like "*a*" and like "*z*")]。 运算符名称区分大小写。该表达式造成一个解析错误,因为 AND 不是一个有效的运算符:[> 0 AND < 10]。 下表展示了如何使用比较运算符和匹配的输入值。 在消息响应器中设置数据源关联的整个过程(配置请求中的值以与数据源列中的值进行比较),在数据源关联性选项卡中有所描述。条件表达式概要
true
,则该值视为匹配项。使用 SQL 响应器的条件表达式
select id, name from widget where yearCreated = 2008 and category = 'tool-metal'
select id, name from widget where yearCreated = 2011 and category = 'construction-molding'
select id, name from widget where yearCreated = ${yearCreated} and category = ${category}
yearCreated category ResultSet File Response Time (ms) 2008 tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 yearCreated category ResultSet File Response Response [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 true
或 false
。如果输入值小于数 2008,则表达式 [< 2008] 返回 true
。传入值从传入 SQL 语句中获得:SQL 响应器解析 SQL,找到对应于查询模板中 "${yearCreated}" 的值,并提供该值作为 [< 2008] 表达式的输入值。 variable1 < variable2
。在条件表达式中,运算符左侧不会显示任何值:运算符做测试值是隐式的输入值。表达式 [< 2008] 检查输入值是否小于 2008,而 [>= 2008] 检查输入值是否大于或等于 2008。yearCreated category ResultSet File Response Time (ms) [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 2011 [like "construction-*"] database_widgets\file4.csv 0 2011 [=~ /^circuit(-.+)?$/] database_widgets\file5.csv 0 yearCreated category ResultSet File Response Time (ms) [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 2011 [like "construction-*"] database_widgets\file4.csv 0 2011 [=~ /^circuit(-.+)?$/] database_widgets\file5.csv 0 [>= 2000 and <= 2007] [*] database_widgets\file6.csv 0 [*] [*] database_widgets\file7.csv 0 条件表达式语法
true
或 false
。true
表示成功匹配。比较运算符
运算符 含义 <= 小于或等于 < 小于 == 等于 >= 大于或等于 > 大于 != 不等于 [< "xyz"]
abc
等价于下述表达式: [== "abc"]
转义序列 含义 ASCII 字符编码(十六进制) \b 退格键 0x08 \t tab 0x09 \n newline 0x0A \f formfeed 0x0C \r carriage return 0x0D \" 双引号字符 0x22 \' 单引号字符 0x27 \\ 反斜杠字符 0x5C 表达式 匹配 不匹配 [== 55] 数字或字符串:60 [> 55] 数字或字符串:56, 56.0, 3.1e24 数字或字符串:55, 10 [== "55"] [> "55"]
字符串:56, 55.0[== "greetings"] greetings xyz greetings greetings xyz [>= "abc"] abc, abca, greetings ABC, ab, 11 [== "this is \"quoted\""] this is "quoted" this is \"quoted\" this is "quoted" this is "quoted" this is \"quoted\" 不可解析表达式 解析错误 [xyz 字面量文本以括号开始。使用 == 运算符。 [55] 没有运算符。Use == operator. ["something"] 没有运算符。Use == operator. [== 55 缺失闭括号。 字符串模式匹配
表达式 匹配 不匹配 [like "a*b"] ab, axb, axxb,axyzb abx [like "a?b"] axb, aab, abb ab, axxb, axyzb [=~ /^a.*b$/] ab, axb, axxb,axyzb abx [=~ /^a.b$/] axb, aab, abb ab, axxb, axyzb [=~ /^id-\d+$/] id-1, id-456 id-, id-xyz, id-2b [=~ /beta/] beta, alpha-beta, alpha-beta-gamma alpha, BETA [=~ /^beta$/] beta alpha, BETA, alpha-beta, alpha-beta-gamma [=~ /(?i)^beta$/] beta, BETA alpha, alpha-beta, alpha-beta-gamma [=~ /^.*\/.*$/] alpha/beta, / alpha, alpha\beta [=~ /^.*\\.*$/] alpha\beta, \ alpha, alpha/beta [=~ /^a\Q.*\Eb$/] a.*b ab, axb, axxb, axyzb, abx 组合表达式
true
。表达式 匹配 不匹配 [>= 0 and <= 9] 字符串或数字:0, 3.14159, 5, 9.0 字符串或数字:-1, 10.12, 5.7e+12 [like "*b*" or like "*a*" and like "*z*"] b, mnb, ba, bz, za a, z [like "*b*" or (like "*a*" and like "*z*")] b, mnb, ba, bz, za a, z [(like "*b*" or like "*a*") and like "*z*"] bz, za, zaabxyz a, b, z, mnb, ba [(((== "abc")))] abc xyz 在消息响应器中使用条件表达式
Overview
Content Tools