niwawa 发表于 2016-4-24 09:11:33

用%regex函数解决721因变量赋值带来的乱码问题

本帖最后由 niwawa 于 2016-4-24 01:14 AM 编辑

首先要搞清楚721乱码产生的原因:
trigger抓取并赋值不会产生乱码
对变量进行函数运算本身不会产生乱码
对上一步的运算结果再进行变量赋值就会产生乱码

来看一个简单的例子

触发行
突然起了一阵怪风,天珠被风一吹,朝着(*)方向滚了过去。

命令行
#var aaa "%1"
#var bbb %replace( @aaa, " ", "") //去掉aaa里面的随机空格
#if %ismember( @bbb, "丝绸之路") {#show test1 yes} {#show test1 no}
#if %ismember( %replace( @aaa, " ", ""), "丝绸之路") {#show test2 yes} {#show test2 no}

执行结果
突然起了一阵怪风,天珠被风一吹,朝着 丝 绸 之 路方向滚了过去。
test1 no
test2 yes

上面4条命令的执行结果说明,变量aaa不产生乱码,对变量aaa执行replace运算本身也不产生乱码(test2可证明),但将replace运算的结果赋值给bbb,则bbb产生乱码。
因此,写721机器时对中文变量应尽量少进行赋值操作,这样可减少乱码产生的可能性。
但是在写复杂机器的时候,有时不得不对中文变量进行运算并对结果进行赋值以便于后面调用,这时可用%regex函数来代替#var操作。

还是上面的例子

触发行
突然起了一阵怪风,天珠被风一吹,朝着(*)方向滚了过去。

命令行
#var aaa "%1"
#noop %regex( %replace( @aaa, " ", ""), "(.+)", bbb)
#if %ismember( @bbb, "丝绸之路") {#show test3 yes} {#show test3 no}

执行结果
突然起了一阵怪风,天珠被风一吹,朝着 丝 绸 之 路方向滚了过去。
test3 yes

%regex(s,regular-expression[,var1,var2,...varN,varN+1])这个函数是用正则表达式对字串s进行匹配,匹配的结果存储在变量var1~varN中
因此,%regex( %replace( @aaa, " ", ""), "(.+)", bbb)这个命令即是用"(.+)"这个正则规则(即全部匹配)去匹配%replace( @aaa, " ", "")这个字串,匹配结果存储在变量bbb中。这个命令与 #var bbb %replace( @aaa, " ", "")的意义是一样的,但却有效避免了变量bbb的乱码问题。

推而广之,对于#var 变量 函数表达式 这样的命令,都可以用#noop %regex(函数表达式,"(.+)", 变量) 来代替以避免乱码问题。

北大侠客行MUD,中国最好的MUD

seagull 发表于 2016-4-24 17:25:51

高手高手高高手
虽然我看不懂

kankana 发表于 2016-4-24 23:12:34

高手高手高高手

oolong 发表于 2016-4-28 10:25:12

好思路
#var 不会乱
分割字符用这个好
判断用%ismember

qingfei 发表于 2016-4-29 06:07:08

一直都解决不了乱码问题,这下把机器都改下试试

niwawa 发表于 2016-4-29 06:58:02

回复 5# qingfei

如遇问题,欢迎一起探讨。我的721机器暂未遇到难以解决的乱码问题,也没有使用过以乱码对乱码这种解决方案。

niwawa 发表于 2016-4-29 07:01:48

回复 4# oolong

oolong前辈才是真正的高手,你的帖子我几乎每贴必看。

oolong 发表于 2017-8-30 20:30:42

总结一下:
目前看这是比较合理解决乱码问题的办法。
基于防止乱码的地方我总结一下。
假设:
#var a "口水"
#var b "苦逼"

一、判断字符串
#if %ismember(@a,@b) {#say 一样} {#say 不一样}

二、触发
rex:   (%x)死了。
#if %ismember(%1,@a) {#say npc @a 死了}

三、合并
#no %regex(@a@b,"(.*)",cc)
这样就把@a @b 合并赋值给cc了

四、分解
这个就随意了。
比如:
#var a 扬州一口井
#no %regex(@a,"(?:扬州|洛阳)(.*)",cc)

#var a 扬州一口井
#no %regex(@a,"\S{6}(\S{2}).*",cc)
例子是截取 @a 的第4个字,正则中一个中文两个字节。

五、其实用%match也一样,触发器规则,%regex是正则规则。

ajump 发表于 2020-11-5 09:22:02

这个是非常好,但是如何解决

id的值是孔子,

helpme ask @id

的问题嘞?

man 发表于 2020-11-14 21:57:47

本帖最后由 man 于 2020-11-14 10:00 PM 编辑

我也研究了一下,解决方法如下:
#ALIAS mysend {#SS "VBScript" Dim mysend
mysend = getvar("mysend","").value
ProcessCommand mysend}
1)首先你要一个mysend 的alias(如上面)
alias 内容:
Dim mysend
mysend = getvar("mysend","").value
ProcessCommand mysend


2) 你需要一个mysend变量,比如 helpme find 孔子
输入mysend
页: [1] 2
查看完整版本: 用%regex函数解决721因变量赋值带来的乱码问题