表达式

概述

可以使用表达式进行比较或运算,将结果作为参数值输入到动作模块中。


表达式可以用于各种通过输入框指定参数值的地方。

image.png

插值(以$$开始)应该只用于拼接文本;所有需要计算、比较的地方,应该使用表达式(以$=开始)简化操作并提升性能。

表达式在内部使用DynamicExpresso 库实现。


表达式基础

表达式是由一个或多个操作数(变量或常量)以及零个或多个运算符组成的序列,其结果为一个值。例如:

  • 5
  • {秒数}*1000
  • "你好," + {姓名}
  • {次数} > 5
  • {选项} == "选项1"


启用表达式

在输入框的开始处写$= 只在开始处写)作为启用表达式的开关,后面写表达式的内容。

image.png


在表达式中使用变量

与插值写法类似,表达式中使用 {变量名} 的方式表示动作中的变量。注意变量名需要以英文字母或汉字开始,不能以数字开始,不能包含特殊符号。


与插值方式不同的是,插值将直接将变量的内容转换成文本插入当前位置,而在表达式中,将使用变量本身参与运算,不再转换成文本。


常量

表达式中不变的内容称作常量。

  • 布尔常量:true  false
  • 数字常量:10   50.1
  • 文本常量使用英文半角双引号包围:"China"
  • 字符常量: 'A'  'c'


转义字符

在文本或字符的常量值中,可以使用转义字符表示特殊符号。支持的转义字符:

  • \' - 单引号 single quote, needed for character literals
  • \" - 双引号 double quote, needed for string literals
  • \\ - 斜线 backslash
  • \n - 换行 New line (character 10)
  • \r - 回车 Carriage return (character 13)
  • \t - Tab跳格 Horizontal tab (character 9)



表达式的运算结果

根据表达式的实际计算内容,其结果可能是文本/数字/日期/布尔等类型。应尽量使表达式的输出类型与动作模块参数类型相同。

如果参数的类型与表达式结果的不同,Quicker将尝试自动转换(如将文本转换为数字等)。


内置支持的数据类型(C#)


类型

备注

bool 布尔

true/false


char 字符

'A' 

单引号包围的单个字符。如可用于判断文本内容的第1个字符是不是'A':

$= {文本变量}[0] == 'A'

string 字符串

"Quicker Is Cool!"

半角双引号包围的一串文本。等同于Quicker的文本变量类型。

Int16 UInt16 Int32 int UInt32 Int64 long UInt64  

Single Double double Decimal decimal 

各种数字类型

123

123.45

Quicker的数字类型变量在内部使用c#的Decimal类型。

DateTime TimeSpan 时间日期、时间间隔类型

2020-2-20 20:20:20

Quicker日期时间类型变量内部使用c# DateTime类型。

Guid 唯一ID

0C024548-D718-4CDD-BC73-87D21AC1A183


Math 数学类

Convert  数据类型转换类


提供一些可用的函数对常量或变量进行计算或类型转换。


运算符

注:以下部分内容摘录自https://www.runoob.com/csharp/csharp-regular-expressions.html 有删改。


算术运算符

下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
+

把两个操作数相加

把两个字符串相加

A + B 将得到 30

"Hello " + {Name}

-从第一个操作数中减去第二个操作数A - B 将得到 -10
*把两个操作数相乘A * B 将得到 200
/分子除以分母B / A 将得到 2
%取模运算符,整除后的余数B % A 将得到 0

关系运算符

下表显示了 C# 支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 不为真。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 不为真。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 不为真。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。


逻辑运算符

下表显示了 C# 支持的所有逻辑运算符。假设变量 A 为布尔值 true,变量 B 为布尔值 false,则:

运算符描述实例
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(A || B) 为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。


位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q
00000
01011
11110
10011


条件运算符?:     

写法:条件 ? 条件成立时返回的值 条件不成立返回的值,例如:

    • 取两个变量的最大值: $= {a} > {b} ? {a} : {b}
    • 取3个变量的最大值:$= {a} > {b} ? ({a} > {c} ? {a} : {c} ): {b}


取列表的一项

写法:{列表变量}[序号]

序号从0开始。


取词典变量的一项

写法:{词典变量}["键"]


运算符的优先级

遵循c#语言的语法,请参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/index#code-try-0


一般的:

  • 括号具有更高的优先级  (2+3)*5 的值为25。
  • 乘除优先级大于加减。 2+3*5 的值为17。
  • 加减的优先级大于比较。 2+3 > 5 的值为true。



调用变量(或常量的)属性或方法

变量或常量,在c#内部都是某种对象,每种对象会支持一些c#的属性或方法函数。调用方法一般为:

  • 属性: {变量}.属性名
  • 变量实例方法: {变量}.方法名(参数列表)
  • 类型的静态方法:类型名.方法名(参数列表)


文本类型的常用属性和方法

更详细的说明请参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.string?view=netframework-4.8#methods

属性或方法

说明

示例

Length

取文本内容的长度

{文本变量}.Length   取变量的值的长度

"Quicker".Length    取常量的值的长度

Contains(string)

检查文本是否包含指定的内容。返回布尔值

{文本变量}.Contains("Quicker")

EndsWith(string)

EndsWith(char)

检查文本是否以指定内容结束

{文本变量}.EndsWith('A')

{文本变量}.EndsWith(".exe")

IndexOf(string)

IndexOf(char)

检查指定内容在文本中的位置。


LastIndexOf(string)

LastIndexOf(char)

指定的内容在文本中最后出现的文字


PadLeft(int,char)

返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。

{文本变量}.PadLeft(20, '0')

Replace(string, string)

替换内容

{文本变量}.Replace("Qk", "Quicker")

Split(char[])

拆分文本为列表

{文本内容}.Split(' ')  使用空格将文本拆分成列表

StartWith(string)

StartWith(char)

检查文本是否以指定内容开始


SubString(int)

SubString(int,int)

截取从指定位置开始的一部分文本


ToLower()

ToUpper()

转换为小写或大写格式。


Trim()

TrimStart()

TrimEnd()

移除开始和/或结束的空白字符。


[序号]

取第几个字符

{文本变量}[0] == 'Q'    判断文本的第一个字符是否为Q


数学计算

数学除了可以直接使用普通的计算表达式外,还可以使用c#的静态类Math。

可以在表达式中直接使用的常量:

  • Math.E   自然对数底
  • Math.PI  π

如,求圆的面积 $= Math.PI * {R} * {R}


可以在表达式中使用Math的静态方法。具体请参考:https://docs.microsoft.com/en-us/dotnet/api/system.math?view=netframework-4.8

如:求2的指定次方: $= Math.Pow(2, {次数})


转换值的类型

  • 数字转换为文本可以使用数字的.ToString()方法。 如 $= {数字变量}.ToString()
  • 文本转换成数字,可以是Deciaml.Parse(string)方法。 如 $=Deciaml.Parse({文本变量})
  • 也可以使用C# 的Convert类转换数据的类型。转换为数字:$= Convert.ToDeciaml({文本变量})

请参考:https://docs.microsoft.com/en-us/dotnet/api/system.convert?view=netframework-4.8


其他处理

词典操作

  • 获取所有键的列表:   $= {词典变量}.Keys
  • 获取所有值的列表:   $= {词典变量}.Values
  • 获取某个键的值: $= {词典变量}["键名"]
  • 是否包含某个键: $= {词典变量}.ContainsKey("键")


与插值方式的比较

  • 插值的作用是将变量的值插入到一段文本中。其结果也是一段文本。
  • 在需要接收布尔类型值的参数中(例如,在“如果”模块),插值后的结果文本会被作为一个表达式进行解析,转换为布尔值。
    • 比较字符串时,插值方式使用单引号包围两个被比较的字符串。
      image.png
    • 使用表达式时,变量名不需要使用单引号包围。文本内容使用双引号包围。
      image.png
  • 在需要比较、计算的场景下,应该使用$=表达式的写法。



插值

表达式

启动指令

参数的开始加$$

参数的开始加$=

主要用途

拼接文本

计算、比较,或较为复杂的变量操作

实现方式

将变量的值插入到文本中,组合成一段大的文本。

如果模块参数需要的不是文本值,则将插值后的文本转换为目标格式。(如数字和布尔类型的参数,会将插值后的文本内容进行表达式计算)

将Quicker变量使用c#语言变量的方式进行处理。


支持变量原始对象的c#方法和属性调用。

比较一个文本不为空并且长度超过5:

$= !String.IsNullOrEmpty({thePath}) && {thePath}.Length > 10

优缺点

优点:

  • 拼接文本比较方便

缺点:

  • 功能比较受限

优点:

  • 可以使用变量自身的c#属性和方法;
  • 功能强大;


示例:


插值

表达式

组合文本

$$ 你好, {name}

将{name}的值替换到文本中

$= "你好," + {name}

相当于两个文本对象相加

比较大小

$$ {数字变量} > 5

插值后进行解析,仅在部分模块中支持。

$= {数字变量} > 5





语雀在语雀上查看