|
首先,说明下资料的来源:
这个是本论坛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*\(([a-zA-Z-]+)\)\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[2]," ")
- local fullnpcname=npcname_table[table.maxn(npcname_table)]
- local npcid=string.lower(wildcards[3])
- npcname,num=getitemnum(wildcards[2])
- npclist[npcname]={["id"]=npcid,["num"]=num,}
- npclist[fullnpcname]={["id"]=npcid,["num"]=num,}
- npclist[npcid]={["name"]=npcname,["num"]=num,}
- --Note("itemlist[item] itemlist[itemid..'num'] itemlist[itemid..'name']")
- --Note("ID:>>"..npclist[npcname]["id"].."<<名字::>>"..npclist[npcid]["name"].."<<数量::>>"..npclist[npcname]["num"])
- end
复制代码- nums={}
- _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[string.sub(str,i-1,i)]==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[char]~=nil then
- result=result+_nums[char]*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[2]~=false then
- num=ctonum(matchs[2])
- str=matchs[5]
- end
- end
- return str,num
- end
复制代码
[ 本帖最后由 littleknife 于 2011-10-5 08:54 PM 编辑 ] |
|