littleknife 发表于 2011-7-25 18:24:36

正则表达式_自学心得

首先,说明下资料的来源:
这个是本论坛whuan大神的原帖:
http://pkuxkx.net/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.net/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 编辑 ]

littleknife 发表于 2011-7-25 18:24:48

二、正则表达式的测试方法:
注:在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 编辑 ]

labaz 发表于 2011-7-25 20:01:57

膜拜下…

redcoat 发表于 2011-7-25 21:13:21

不错不错,正则、数据库、lua都是非常重要的基本功ttk_00

alexone 发表于 2011-7-26 08:00:22

原帖由 redcoat 于 2011-7-25 09:13 PM 发表 http://pkuxkx.net/forum/images/common/back.gif
不错不错,正则、数据库、lua都是非常重要的基本功ttk_00

hz8原来是你这个坏人,我小号挂机呢,你经常跑过来打我

redcoat 发表于 2011-7-26 12:07:54

原帖由 alexone 于 2011-7-26 08:00 AM 发表 http://pkuxkx.net/forum/images/common/back.gif


hz8原来是你这个坏人,我小号挂机呢,你经常跑过来打我

失礼失礼,我只是想试试steal命令,没想到竟然打起来啦yct34

labaz 发表于 2011-7-26 12:14:09

楼上的两位有基情

alexone 发表于 2011-7-26 14:06:09

原帖由 redcoat 于 2011-7-26 12:07 PM 发表 http://pkuxkx.net/forum/images/common/back.gif


失礼失礼,我只是想试试steal命令,没想到竟然打起来啦yct34

你每过十几二十几分钟就过来打一下,连续打了3、4次,这叫“没想到竟然打起来啦”

干了坏事为啥不敢承认呢

xspe 发表于 2012-4-5 16:16:04

请问littleknife能发个Mtrace2.1 中文汉化破解版上来不?

xspe 发表于 2012-4-5 16:34:57

小刀,为何我用你贴出来的正则的精神实验了一下,为何使用Mtrace2.1,进MUD里把我的精神贴出来,结果没用呢?说无法匹配
页: [1] 2
查看完整版本: 正则表达式_自学心得