北大侠客行MUD论坛

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

正则表达式_自学心得

[复制链接]
发表于 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):
  1. ^【 精神 】\s*(\d+)\s*/\s*(\d+)\s*\[\s*(\d+)%\]\s*【 精力 】\s*(\d+)\s*/\s*(\d+)\s*\(\s*\+\s*(\d+)\)
  2. ^【 气血 】\s*(\d+)\s*/\s*(\d+)\s*\[\s*(\d+)%\]\s*【 内力 】\s*(\d+)\s*/\s*(\d+)\s*\(\s*\+\s*(\d+)\)
  3. ^【 食物 】\s*(\d+)\s*/\s*(\d+)\s*\[\S+\]\s*【 潜能 】\s*([-]{0,1}\S+)\s*
  4. ^【 饮水 】\s*(\d+)\s*/\s*(\d+)\s*\[\S+\]\s*【 经验 】\s*(\S+)\s*
复制代码
例子2:技能的获取:(Skills),有效等级:

  1. ^\s*(\S+)\s*\(([a-zA-Z-]+)\)\s*:\s*(\S+)\s*有效等级:\s*(\d+)$
复制代码


例子3:npc名字,个数的获取:
  1. ^(\s+)([^a-z!@#$%\^&*()\\/.,<> ]+)\((\w*\s{0,1}\w+)\)$|^(\s+)([^a-z!@#$%\^&*()\\/.,<> ]+)\((\w*)\)$
复制代码
这个注明下:对应的函数如下:

  1. npclist={}
  2. npcname_table={}
  3. on_npcs=function(name, line, wildcards)
  4. local npcname_table=utils.split(wildcards[2]," ")
  5. local fullnpcname=npcname_table[table.maxn(npcname_table)]
  6. local npcid=string.lower(wildcards[3])
  7. npcname,num=getitemnum(wildcards[2])
  8. npclist[npcname]={["id"]=npcid,["num"]=num,}
  9. npclist[fullnpcname]={["id"]=npcid,["num"]=num,}
  10. npclist[npcid]={["name"]=npcname,["num"]=num,}
  11. --Note("itemlist[item]      itemlist[itemid..'num']    itemlist[itemid..'name']")
  12. --Note("ID:>>"..npclist[npcname]["id"].."<<名字::>>"..npclist[npcid]["name"].."<<数量::>>"..npclist[npcname]["num"])

  13. end
复制代码
  1. nums={}
  2. _nums["一"]=1
  3. _nums["二"]=2
  4. _nums["三"]=3
  5. _nums["四"]=4
  6. _nums["五"]=5
  7. _nums["六"]=6
  8. _nums["七"]=7
  9. _nums["八"]=8
  10. _nums["九"]=9


  11. ctonum=function(str)
  12. if (#str % 2) ==1 then
  13. return 0
  14. end
  15. result=0
  16. wan=1
  17. unit=1
  18. for i=#str -2 ,0,-2 do
  19. char=string.sub(str,i+1,i+2)
  20. if (char=="十") then
  21. unit=10*wan
  22. if (i==0) then
  23. result=result+unit
  24. elseif _nums[string.sub(str,i-1,i)]==nil then
  25. result=result+unit
  26. end
  27. elseif (char=="百") then
  28. unit=100*wan
  29. elseif (char=="千") then
  30. unit=1000*wan
  31. elseif (char=="万") then
  32. unit=10000*wan
  33. wan=10000
  34. else
  35. if _nums[char]~=nil then
  36. result=result+_nums[char]*unit
  37. end
  38. end
  39. end
  40. return result
  41. end

  42. itemnumre=rex.new("(((零|一|二|三|四|五|六|七|八|九|十|百|千|万)*)(支|顶|块|朵|面|匹|位|支|颗|个|把|只|粒|张|枚|件|柄|根|块|文|两|碗|滴)){0,1}(.*)")

  43. getitemnum=function(str)
  44. num=1
  45. a,b,matchs=itemnumre:match(str)
  46. if matchs~=nil then
  47. if matchs[2]~=false then
  48. num=ctonum(matchs[2])
  49. str=matchs[5]
  50. end
  51. end
  52. return str,num
  53. end
复制代码

[ 本帖最后由 littleknife 于 2011-10-5 08:54 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2011-7-25 18:24:48 | 显示全部楼层
二、正则表达式的测试方法:
注:在MUSH中有一种脚本引用方式,称为格式引用。就是脚本所对应的函数是如下:
  1. on_npcs=function(name, line, wildcards)
复制代码
这里的name是你的脚本自定义的那个名字,比如我给npc名字的触发定义个名字叫npc_items,
那么name=npc_items
line=wildcards[0],(不常用)
wildcards[1]是第一个参数,wildcards是第i个参数。

用例子3是我非常喜欢的一个正则触发。下面测试其合理性:
启动Mtrace2.1 中文汉化破解版,在对应位置输入下面的内容。如下图:


你会很清晰的看到wildcards[0],wildcards[1]...等等参数你是否触发的正确。
   
    也就是说当你在mud窗口中抓了一串字符串的时候,想用相应的正则代码替换它,就很方便的成为通用的触发了,那么你就可以考虑用这个小工具,简单的把对应的部分修改为正则的代码就可以了。

例子3 目前主要用在:朝廷守门机器人的判断壮汉数量上,非常有效的判断壮汉的数量,当超过一定数量就用kill命令干掉几个保证安全。




--------------------------------------------------------------------------------
自学笔记。。欢迎拍砖,见笑了各位。。。


[ 本帖最后由 littleknife 于 2011-7-25 10:41 PM 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-25 20:01:57 | 显示全部楼层
膜拜下…
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-25 21:13:21 | 显示全部楼层
不错不错,正则、数据库、lua都是非常重要的基本功
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-26 08:00:22 | 显示全部楼层
原帖由 redcoat 于 2011-7-25 09:13 PM 发表
不错不错,正则、数据库、lua都是非常重要的基本功


原来是你这个坏人,我小号挂机呢,你经常跑过来打我
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-26 12:07:54 | 显示全部楼层
原帖由 alexone 于 2011-7-26 08:00 AM 发表


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


失礼失礼,我只是想试试steal命令,没想到竟然打起来啦
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-26 12:14:09 | 显示全部楼层
楼上的两位有基情
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2011-7-26 14:06:09 | 显示全部楼层
原帖由 redcoat 于 2011-7-26 12:07 PM 发表


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


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

干了坏事为啥不敢承认呢
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-4-5 16:16:04 | 显示全部楼层
请问littleknife能发个Mtrace2.1 中文汉化破解版上来不?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2012-4-5 16:34:57 | 显示全部楼层
小刀,为何我用你贴出来的正则的精神实验了一下,为何使用Mtrace2.1,进MUD里把我的精神贴出来,结果没用呢?说无法匹配
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 05:15 PM , Processed in 0.011476 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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