北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 8116|回复: 11

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

[复制链接]
发表于 2016-4-24 09:11:33 | 显示全部楼层 |阅读模式
本帖最后由 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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2016-4-24 17:25:51 | 显示全部楼层
高手高手高高手
虽然我看不懂
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2016-4-24 23:12:34 | 显示全部楼层
高手高手高高手
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2016-4-28 10:25:12 | 显示全部楼层
好思路
#var 不会乱
分割字符用这个好
判断用%ismember
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2016-4-29 06:07:08 | 显示全部楼层
一直都解决不了乱码问题,这下把机器都改下试试
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2016-4-29 06:58:02 | 显示全部楼层
回复 5# qingfei

如遇问题,欢迎一起探讨。我的721机器暂未遇到难以解决的乱码问题,也没有使用过以乱码对乱码这种解决方案。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2016-4-29 07:01:48 | 显示全部楼层
回复 4# oolong

oolong前辈才是真正的高手,你的帖子我几乎每贴必看。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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是正则规则。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2020-11-5 09:22:02 | 显示全部楼层
这个是非常好,但是如何解决

id的值是孔子,

helpme ask @id

的问题嘞?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-4-26 11:41 PM , Processed in 0.010903 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表