正则表达式_自学心得
首先,说明下资料的来源:这个是本论坛whuan大神的原帖:
http://pkuxkx.com/forum/viewthread.php?tid=2940&highlight=%D5%FD%D4%F2%B1%ED%B4%EF%CA%BD
这个是现在可以看到的学习教程:《深入浅出之正则表达式》
http://www.cnblogs.com/dragon/archive/2006/05/08/394078.html
《正则表达式学习参考》
http://blog.csdn.net/lxcnn/article/details/4268033
这个是可以测试自己写的正则表达式是否正确的小工具的帖子
http://pkuxkx.com/forum/thread-22258-1-1.html
一、MUD中正则表达式的用法:
例子1:个人状态的获取(Status):^【 精神 】\s*(\d+)\s*/\s*(\d+)\s*\[\s*(\d+)%\]\s*【 精力 】\s*(\d+)\s*/\s*(\d+)\s*\(\s*\+\s*(\d+)\)
^【 气血 】\s*(\d+)\s*/\s*(\d+)\s*\[\s*(\d+)%\]\s*【 内力 】\s*(\d+)\s*/\s*(\d+)\s*\(\s*\+\s*(\d+)\)
^【 食物 】\s*(\d+)\s*/\s*(\d+)\s*\[\S+\]\s*【 潜能 】\s*([-]{0,1}\S+)\s*
^【 饮水 】\s*(\d+)\s*/\s*(\d+)\s*\[\S+\]\s*【 经验 】\s*(\S+)\s*例子2:技能的获取:(Skills),有效等级:
^\s*(\S+)\s*\((+)\)\s*:\s*(\S+)\s*有效等级:\s*(\d+)$
例子3:npc名字,个数的获取:^(\s+)([^a-z!@#$%\^&*()\\/.,<> ]+)\((\w*\s{0,1}\w+)\)$|^(\s+)([^a-z!@#$%\^&*()\\/.,<> ]+)\((\w*)\)$这个注明下:对应的函数如下:
npclist={}
npcname_table={}
on_npcs=function(name, line, wildcards)
local npcname_table=utils.split(wildcards," ")
local fullnpcname=npcname_table
local npcid=string.lower(wildcards)
npcname,num=getitemnum(wildcards)
npclist={["id"]=npcid,["num"]=num,}
npclist={["id"]=npcid,["num"]=num,}
npclist={["name"]=npcname,["num"]=num,}
--Note("itemlist itemlist itemlist")
--Note("ID:>>"..npclist["id"].."<<名字::>>"..npclist["name"].."<<数量::>>"..npclist["num"])
endnums={}
_nums["一"]=1
_nums["二"]=2
_nums["三"]=3
_nums["四"]=4
_nums["五"]=5
_nums["六"]=6
_nums["七"]=7
_nums["八"]=8
_nums["九"]=9
ctonum=function(str)
if (#str % 2) ==1 then
return 0
end
result=0
wan=1
unit=1
for i=#str -2 ,0,-2 do
char=string.sub(str,i+1,i+2)
if (char=="十") then
unit=10*wan
if (i==0) then
result=result+unit
elseif _nums==nil then
result=result+unit
end
elseif (char=="百") then
unit=100*wan
elseif (char=="千") then
unit=1000*wan
elseif (char=="万") then
unit=10000*wan
wan=10000
else
if _nums~=nil then
result=result+_nums*unit
end
end
end
return result
end
itemnumre=rex.new("(((零|一|二|三|四|五|六|七|八|九|十|百|千|万)*)(支|顶|块|朵|面|匹|位|支|颗|个|把|只|粒|张|枚|件|柄|根|块|文|两|碗|滴)){0,1}(.*)")
getitemnum=function(str)
num=1
a,b,matchs=itemnumre:match(str)
if matchs~=nil then
if matchs~=false then
num=ctonum(matchs)
str=matchs
end
end
return str,num
end
[ 本帖最后由 littleknife 于 2011-10-5 08:54 PM 编辑 ] 二、正则表达式的测试方法:
注:在MUSH中有一种脚本引用方式,称为格式引用。就是脚本所对应的函数是如下:on_npcs=function(name, line, wildcards)这里的name是你的脚本自定义的那个名字,比如我给npc名字的触发定义个名字叫npc_items,
那么name=npc_items
line=wildcards,(不常用)
wildcards是第一个参数,wildcards是第i个参数。
用例子3是我非常喜欢的一个正则触发。下面测试其合理性:
启动Mtrace2.1 中文汉化破解版,在对应位置输入下面的内容。如下图:
你会很清晰的看到wildcards,wildcards...等等参数你是否触发的正确。
也就是说当你在mud窗口中抓了一串字符串的时候,想用相应的正则代码替换它,就很方便的成为通用的触发了,那么你就可以考虑用这个小工具,简单的把对应的部分修改为正则的代码就可以了。
例子3 目前主要用在:朝廷守门机器人的判断壮汉数量上,非常有效的判断壮汉的数量,当超过一定数量就用kill命令干掉几个保证安全。
--------------------------------------------------------------------------------
自学笔记。。欢迎拍砖,见笑了各位。。。hzx hzx
[ 本帖最后由 littleknife 于 2011-7-25 10:41 PM 编辑 ] 膜拜下… 不错不错,正则、数据库、lua都是非常重要的基本功ttk_00 原帖由 redcoat 于 2011-7-25 09:13 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
不错不错,正则、数据库、lua都是非常重要的基本功ttk_00
hz8原来是你这个坏人,我小号挂机呢,你经常跑过来打我 原帖由 alexone 于 2011-7-26 08:00 AM 发表 http://pkuxkx.com/forum/images/common/back.gif
hz8原来是你这个坏人,我小号挂机呢,你经常跑过来打我
失礼失礼,我只是想试试steal命令,没想到竟然打起来啦yct34 楼上的两位有基情 原帖由 redcoat 于 2011-7-26 12:07 PM 发表 http://pkuxkx.com/forum/images/common/back.gif
失礼失礼,我只是想试试steal命令,没想到竟然打起来啦yct34
你每过十几二十几分钟就过来打一下,连续打了3、4次,这叫“没想到竟然打起来啦”
干了坏事为啥不敢承认呢 请问littleknife能发个Mtrace2.1 中文汉化破解版上来不? 小刀,为何我用你贴出来的正则的精神实验了一下,为何使用Mtrace2.1,进MUD里把我的精神贴出来,结果没用呢?说无法匹配
页:
[1]
2