通过含参关键词我们可以提取出更多有用的信息——这样我们就可以玩出更多的花样了。
编辑于2020.2.8 转载请注明作者
什么叫做参数
参数,顾名思义,就是可以参考的数
参数,也叫参变量,是一个变量。我们在研究当前问题的时候,关心某几个变量的变化以及它们之间的相互关系,其中有一个或一些叫自变量,另一个或另一些叫因变量。如果我们引入一个或一些另外的变量来描述自变量与因变量的变化,引入的变量本来并不是当前问题必须研究的变量,我们把这样的变量叫做参变量或参数。
来源:百度百科
英文名:Parameter。
简单说,在我们研究的范围内,可以将参数完全视为变量。
怎么向回复中传入参数
问的好,首先我们要明确,我们的参数是从哪里传过来的。
1 2 3 4 5 6 7 8 9 |
#传入参数的实例 maid:"Yorunina,1+1等于多少?" #此时传入了一个表达式1+1 Yorunina:"1+1=2" #通过对传入参数的处理,我们得到了一个结果 #下文可以忽略 #用铃心写起来是这个样子的 #关键词:Yorunina,([^等]+)等于多少? #回复:【内容】=【计算【内容】】 |
是的,因为铃心的结构是一个极其标准的“输入-输出”结构,因此最初的参数只有可能是从关键词处传入进来的——此时,我们就必须使用前缀匹配或者是正则匹配的方式来从输入中取出我们所需要的参数。
正则匹配的绝对性优势
首先我们来看看比较对象——前缀匹配。
前缀匹配顾名思义,就是前面的只要满足了条件,无论后面是什么,我都不管。
这里我们要提到一个概念,就是铃心变量的【内容】。
1 2 3 4 5 6 7 8 9 10 11 |
【内容】变量说明: 【内容】填写在回复中,表示子关键词,子关键词与匹配规则相关,具体见下个说明(匹配规则说明)。 #【内容】是我们最常用的输入参数的方式,一定要牢记。 >匹配规则说明< 完全匹配 所设关键词和发言一致时(区分大小写),匹配成功。完全匹配不存在子关键词。 模糊匹配 所设关键词包含于发言中(不区分大小写),匹配成功。子关键词是发言中非关键词的部分。 前缀匹配 所设关键词是发言的前缀(区分大小写),匹配成功。子关键词是发言中的非前缀的部分。 正则匹配 所设关键词(即表达式)与发言相匹配时(匹配规则为完全匹配),匹配成功。子关键词是第一个子表达式(第一对英文括号括起来的表达式)所匹配的内容。 若想取出其余子表达式匹配的结果,可用:【内容x】,其代表正则表达式匹配的第x个子表达式匹配的文本。 |
在前缀匹配中,【内容】(子关键词)指的就是前缀屁股后面的任意字符。
1 2 3 4 5 6 7 |
#前缀匹配实例 前缀匹配:你 Yorunina:你好 【内容】:好 Yorunina:你真的好可爱2333 【内容】:真的好可爱2333 #前缀匹配等价于:[前缀文本]([\S\s]*)的正则表达式 |
我们可以看到,这样传入参数的缺点在于——一次只能传入一个参数,而且输入进去的东西可能五花八门。可能你本来想要数字,结果人家传了一堆中文进去,处理都处理不了。
而正则表达式就不一样,我们可以用正则来输入多个参数,并且给予明确的参数类型限制。
1 2 3 4 5 6 7 8 9 10 |
#正则匹配实例 #正则表达式:我喜欢([\D]+)([\d]+)天了 maid:我喜欢Yorunina365天了 【内容1】:Yorunina 【内容2】:365 maid:我喜欢上厕所已经到了无法自拔的地步了! #此时由于不符合正则表达式,所以回复被铃心丢弃,不会有返回结果 #【内容1】指的是[\D]+的匹配结果,【内容2】指的是[\d]+的匹配结果 #正则表达式被加上括号以后,表示括号内的内容被储存在内存中等待调用 #\D代表非数字,\d代表数字 |
在上文的例子中,我们看到,通过括号标识出来的正则表达式,会将内部匹配到的内容储存在【内容x】的内存空间中来供给我们调用。(其中x为第x个子关键词)通过这种方式我们就可以从关键词中提取多个参数来使用了!
参数的综合处理
该部分有一定难度,并且实际使用中效果并不是很大,因此可以选择性的学习。
如果,正则表达式过于复杂,或者说是根本写不出来正则呢?
这么说大家可能有些迷惑——怎么,什么情况下还能写不出来正则表达式呢?我Yorunina第一个不服!
好,我就举一个最近我在研究的例子吧——铃心化Dice的基础骰点功能。
熟悉骰子机器人的都应该知道,.r是骰点的功能,但是实际上.r是省略了几个参数,全文应该是.r1d100。在这个情况下,1这个参数是可有可无的,100也是可有可无的,d也是可有可无的。
在没有明显标识且出现多个可有可无的量的时候,正则表达式的书写就开始变得困难。就算能够写出来,调用它的【内容】会因为其属于位置的不确定性而变得困难。刚才可能数字15是【内容3】,等会儿有可能会因为省略了前面的某个参数而变成了【内容2】。
经验の传授
那这种情况怎么办呢?实际的骰点表达式情况比上文提到的还要复杂的多——这下子穷途末路了?
No,no,no.这个时候聪明的我们就应该想办法了,我们想到的最好的办法就是利用铃心的函数来帮助预处理,从复杂的【内容】中得到我们需要的参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#铃心化Dice #部分:基础骰点部分 #作者:Yorunina #正则匹配:[.。](?i)r([\s\S]*) #以下是回复内容 【子关键词=【判空【内容】>=<1d100】】 #当后文全为空的情况,进行转化 【赋值变量表达式>=<【子正则([\ddpbk]*)\s*([\S\s]*)>=<【内容】>=<1】】 【赋值变量理由>=<【判断【子正则([\ddpbk]*)\s*([\S\s]*)>=<【内容】>=<2】>=<【变量表达式】>=<!source>=<】】 #分离掷骰理由和掷骰表达式,如果理由为空,返回空理由 【赋值变量掷骰次数>=<【判空【子正则(?i)([\d]*)d>=<【变量表达式】>=<】>=<1】】 【赋值变量表达式>=<【替换【变量表达式】>=<【正则(?i)([\d]*)d>=<【变量表达式】>=<】>=<】】 #分离变量,掷骰次数 【赋值变量惩罚骰个数>=<【判空【子正则(?i)p([\d]*)>=<【变量表达式】>=<】>=<0】】 【赋值变量表达式>=<【替换【变量表达式】>=<【正则(?i)p([\d]*)>=<【变量表达式】>=<】>=<】】 【赋值变量奖励骰个数>=<【判空【子正则(?i)b([\d]*)>=<【变量表达式】>=<】>=<0】】 #分离变量,惩罚骰和奖励骰 【赋值变量表达式>=<【替换【变量表达式】>=<【正则(?i)b([\d]*)>=<【变量表达式】>=<】>=<】】 【赋值变量骰子面数>=<【判空【正则[\d]*>=<【变量表达式】>=<1】>=<100】】 #分离变量,骰子面数 #一部分代码...完全版无法放送 #对各个部分的参数进行剥离,并且在处理过程中不断缩短文本长度,将不可确定的量确定化,减少bug |
我们可以看到,当我们仅仅通过一个正则表达式处理不了的问题,我们可以将其简化成多个表达式来共同处理。
一个表达式想要准确的分离出三个乃至五个变量是非常困难的,但是通过这种综合性处理——即多步处理的方法,可以轻松的化解这个难题,并且减少实际运行中混淆的可能。
顺带一提,其实你不会用正则也是可以一次性传入多个参数的,只需要用到上文综合处理的技巧再加上铃心自备的变量——未来就在你的眼前。
后记
参数的综合处理其实一直都是个难题,到现在也是。
因为用户们输入的东西总是千奇百怪——甚至有的东西你根本都理解不了。
所以说,传统的正则其实只解决了怎么输入的参数的问题,而并没有考虑后续处理的难易程度。但是综合性处理可以有效地对传入的参数进行整理和处理,简化了后文的处理难度。
制作不易,请多多评论指教,拜托了!
咕咕咕咕咕
Comments | NOTHING