|
地板
楼主 |
发表于 2020-2-8 09:56:53
|
只看该作者
地板 cdyy说: 本帖最后由 cdyy 于 2020-2-8 14:41 编辑
三、脚本编写
3.1 文本匹配
我们的脚本支持两种文本匹配方式,精确匹配和正则匹配。
3.1.1 精确模式
精确模式匹配可以很精准的找到自己想要的信息。
3.1.1.1 带有双引号
这种精确模式需要我们在书写文本时候用双引号括起来,符号为 "" ,注意他是英文状态下的符号,是半角符号,下面篇幅如果没有特殊说明,遇到的符号也应该都是如此。
例如:
"确定(O)"、"取消(C)"、"此电脑"、"百度一下"都属于合法的写法。
3.1.1.2 省略双引号
为了简化书写,如果文本中没有出现我们脚本中的特殊字符,我们可以省略双引号,也就是说在不会产生歧义的时候就可以省略,例如"确定(O)"可以写成确定(O),但是"诊疗方案[第五版]"就不能写成诊疗方案[第五版],因为方括号在我们的脚本中属于特殊符号,是用来包裹命令的特殊符号,如果这样写,他会把“第五版”识别成一条命令。
关于脚本中使用到的一些特殊符号,请参阅3.2节。
3.1.2 正则表达式(正规表达式)
正则表达式是一种高级的文本匹配模式,他用一些特殊的符号表示一个范围内的文本,用它检索符合某种规则的文本(例如手机号、网址等)是非常容易的事情,但是学习成本稍微有些高,但是我们可以不用完全学会,我们可以稍微记忆一些常用的表达式,如果有兴趣可以自行查阅相关资料。
用它来搜索文本效率会非常高,因此十分推荐使用这种模式。
3.1.2.1 一般写法
如果想使用这种匹配模式,需要用两个斜杠把表达式文本括起来,例如/确定/、/取消/,但是如果仅仅只是想匹配这样的“确定”和“取消”,用正则表达式无非有点小题大做了,这完全可以用3.1.1节的精确模式,因为这表达式中并没有含有正则的特殊字符。
3.1.2.2 正则表达式的标志
例如有一个表达式/本地下载|网通下载|下载/i可以匹配到“本地下载”、“网通下载”和“下载”中的任意一个,后面跟随的i表示不区分大小写,这个i就是正则表达式标志。
下面列出常用的正则表达式标志,用作可选参数。
a ASCII对于字符串模式,使\w,\W,,\B,\d,\D匹配相应的ASCII字符类别(而不是整个Unicode类别,这是默认设置)。对于字节模式,只能使用此标志,无需指定。
i IGNORECASE执行不区分大小写的匹配。
l LOCALE使\w,\W,,\B取决于当前的语言环境。
m MULTILINE“^”匹配行首和字符串开头(在换行符之后)。“$”匹配行尾和字符串结尾(在换行符之前)。
s 点“.”完全匹配任何字符,包括换行符。
x VERBOSE忽略空格和注释,以使RE看起来更好。
u UNICODE仅出于兼容性。忽略字符串模式(这是默认设置),并禁止使用字节模式。
3.1.2.3 常用的正则表达式
符号 读法 描述
. 点号 匹配任意的一个字符
\s 小写s 匹配任意一个空白字符,包括空格、换行符、制表符
\S 大写S 匹配任意一个非空白字符
[a-z] 小写a到z 匹配任意一个小写字母
[A-Z] 大写A到Z 匹配任意一个大写字母
\d 小写d 匹配任意一个数字
\D 大写D 匹配任意一个不是数字的字符
* 星号 匹配前面的表达式多次获0次
+ 加号 匹配前面的表达式至少一次
? 问号 匹配前面的表达式1次货0次
*? 星号问号 匹配前面的表达式0次货多次(注意与多次和0次的区别,这边优先0次,如果不满足时才会多次,就是尽可能少的匹配)
+? 加号问号 匹配前面的表达式1次货多次(尽可能少的匹配)
?? 两个问号 匹配前面的表达式0次货1次(优先0次)
{x,y} x到y 匹配前面的表达式最少x次最多y次,省略其中的x货y表示无限次,但是逗号不能省略
{x} x 匹配前面的表达式x次
\n 小写n 匹配换行符
\t 小写t 匹配制表符
\\ 两个反斜杠 匹配一个反斜杠
| 竖杠 分割两个表达式成并列关系,解释为或者的意思
^ 抑扬号 在表达式开头使用,表示从开头开始按照规则搜索,如果开头部分都不满足就视为匹配失败
$ 美元 在表达式末尾使用,表示从末尾开始按照规则搜索,如果末尾都不满足规则就视为匹配失败
注:在开启了m多行模式的标志后,匹配开头和末尾还将检查行首和行尾。
3.1.2.4 例子
3.1.2.4.1 /.+?\.mp3/
此表达式可以找到a.mp3,b.mp3,0.mp3,abcdefg.mp3等等,其中的“.+?”表示匹配任意字符,而且是尽可能少的匹配,以防止把.mp3也匹配进去(属于匹配过头),由于点号“.”是正则的特殊字符,所以“.mp3”中的点号“.”要加反斜杠,就变成了“\.mp3”。
3.1.2.4.2 /^.{0,2}下载$/
此表达式可以匹配带有任何下载字样的文本,并且用美元“$”严格判断“下载”两个字在末尾的情况,“.{0,2}”表示匹配任意的最多两个字符,还使用抑扬号“^”严格匹配在开头的位置,经过这样的设置后,那么他一定只能匹配在4个字符以内的文本了,例如他可以匹配“电信下载”、“网通下载”、“下载”等。
但是不能匹配“下载吧”,因为美元符号限制下载两个字必须在末尾;
也不能匹配“点此直接下载”,因为抑扬号限制开头是任意两个字符,那么就应该是“点此”两个字,在往后匹配是“直接”并不是“下载两个字”,所以就直接判定匹配失败。
3.1.2.4.3 /1\d{10}/
一个简单的匹配手机号的写法,但是并不严谨,“\d{10}”表示匹配10个数字,在这个表达式前面是1,合起来一共是11位数字,但是从第二位开始,有可能匹配到1,那么手机号一般来说没有11开头的,但是这是非常简单的写法。
3.2 脚本语法
3.2.1 控件描述
对于脚本搜索控件,最直接的办法就是用3.1节所说的文本匹配办法,但是有很多控件并没有文本信息,这个时候就只能利用其它额外的一些信息来描述,这些信息包括角色名、类名、找到的先后次序(我们称为序号),并且要把这些信息用尖括号 <> 括起来,里面每一项信息用英文逗号隔开,这种形式的描述称为控件描述,有文本信息的也可使用这种办法更加细致化的描述。
3.2.1.1 角色名
每一个控件(Control)都有他自己的角色名称,用来区分它们各自的职务,比如“编辑框”就是用来录入和浏览文本的,“按钮”就是用来点击操作的,“复选框”就是用来勾选习惯的。
下面列出所有的角色名:
|
|