用%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 高手高手高高手
虽然我看不懂 高手高手高高手 好思路
#var 不会乱
分割字符用这个好
判断用%ismember 一直都解决不了乱码问题,这下把机器都改下试试 回复 5# qingfei
如遇问题,欢迎一起探讨。我的721机器暂未遇到难以解决的乱码问题,也没有使用过以乱码对乱码这种解决方案。 回复 4# oolong
oolong前辈才是真正的高手,你的帖子我几乎每贴必看。 总结一下:
目前看这是比较合理解决乱码问题的办法。
基于防止乱码的地方我总结一下。
假设:
#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是正则规则。 这个是非常好,但是如何解决
id的值是孔子,
helpme ask @id
的问题嘞? 本帖最后由 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