自定义指令 - 正则

Posted by Vove on January 29, 2019

这是一篇满文大字的文章… , 个人本身并不喜欢看文字, 不方便录视频讲解; 但保证满满关于此应用的干货。

命令正则式

简介

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 —– 百度百科

根据解释,可以看出,可以使用正则来匹配命令。没错,本App目前就是采用这种方式设计的。

不过,目前正则解析器是基于正则的实现改良过,适用于解析参数与中文的,我称它为参数正则解析器

正则学习起来对初学者并不友好,但此App中仅涉及极少的几种情况,并且易于理解;下面会有来自App已有指令的几个示例。

另外,在App内用’%’代替了匹配任意字符,’#’代替匹配任意大小写数字。

示例

  • 1.打(电话)?给@{name}

可以匹配命令的有: 打给...打电话给... 两种,省略号为任意长度任意的字符。

从这可以看出来:

  1. ()?的是可以包含或不包含括号内的;注意这里?和其他符号均为英文符。
  2. @{name} 是用来标记命令中的’参数’,比如在这里代表联系人,其中name指参数名,可还以为contact

其他用法:

(1) 定个?闹钟

匹配: 定闹钟定个闹钟


  • 2.(显示|下拉)?通知栏

可以匹配命令的有: 显示通知栏下拉通知栏通知栏 三种说法。

可以看到括号内有个|符,代表的关系,括号内可以匹配显示下拉 两个词。

  • 3.发消息内容[是为]@{content}

可以匹配命令的有: 发消息内容是..发消息内容为..

[amx] 可等价为(a|m|x) 此外,[a-z] 匹配一个小写字母,[0-9]匹配一个数字,[a-zA-Z]匹配一个字母。

上面讲到了 ()?[] 的用法, 接下来讲另外两个正则符号 *+

  • 如何匹配一个数(100,273)呢?

一个数是多个数字组成的。

[0-9]+可以用来匹配一个数, 多长的数字都可以,至少一个。 (主要讲解符号+意义,不详细讨论分析。)

+ 就限制它的左边表达式匹配次数至少为1 (>=1)。

*+ 区别在于*匹配次数可以为0 (>=0)。

? 匹配次数为0次或1次。

此外,在app正则解析器的设计中,使用%#符号来表示匹配任意字符(大小写)数字 例如:

  1. abc%

    可匹配:以abc开头的任意字符串

  2. abc#

    可匹配:以abc开头,后跟数字的任意字符串。如abc123abc一百二十

没了≡[。。]≡

自定义指令需要的正则知识就这么些, 其他需求可自行深入学习。

参数正则

参数正则是专为此APP设计的,用于方便解析命令中的参数并在脚本中获取。

例如:

  1. 呼叫@{name}  »解析» 呼叫中国移动

得到的name即为中国移动

在脚本中获取方式: argMap['name']

为指令设置正则

首先,命令中有我们在脚本中需要知道的变量, 比如询问天气。

@{city}的?天气(怎么样)? 了解了前文,相信你已经知道这个表达式能匹配到怎样的命令,比如这个命令我们需要获得@{city}匹配到的地名。这里city参数会自动解析出来。

下图,是这个指令的正则设置和测试:

当设置保存之后, 在命令匹配到这条指令时,App内部解析器会将设置的参数解析出,传递给脚本中叫argMap的全局变量。

继续阅读: 自定义指令 - 测试