免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1532 | 回复: 6

一则正则匹配,求指导,求优化 [复制链接]

论坛徽章:
0
发表于 2013-06-09 23:32 |显示全部楼层
本帖最后由 wfnh 于 2013-06-09 23:33 编辑

要匹配一些lua代码,找出所有的变量,如下:
version = 1.0
local var = 1
local done, seq = Package( objid, obj)  #--这里有可能有多个变量local v1, v2,v3,v4  ....... = ........
local function GetRandomRet(randomNum)
  print()
end
......
.....

如上代码,需要匹配出version,var,done,seq

我的正则是:
^\s* #--行首可能的空格
(local)? #--区别变量类型
\s* #--又是没用的空白
((:?[\w_]+\s*,??\s*))+ #考虑到一次声明多个变量的情况
\s*= #--无聊的空白

这样可以匹配出 version,var,seq(这里出现了重复的情况,即seq seq,我预期是done和seq的),然后到local function GetRandomRet(randomNum) 这句的时候就卡住了,估计是疯狂的回溯中,这里求指导

论坛徽章:
0
发表于 2013-06-10 09:44 |显示全部楼层
本帖最后由 kk861123 于 2013-06-10 09:45 编辑

回复 1# wfnh

你的正则:
  1. ^\s* #--行首可能的空格
  2. (local)? #--区别变量类型
  3. \s* #--又是没用的空白
  4. ((:?[\w_]+\s*,??\s*))+ #考虑到一次声明多个变量的情况
  5. \s*= #--无聊的空白

复制代码
第二行:若不使用'?:',$1有可能为local也有可能为捕捉到的变量
  1. (?:local)?
复制代码
第四行:': ?' 是什么?是 '?:' 吧?,'\w'包括'_','+'应该放在括号里才能将多个变量捕捉到当前group中,另外,',??'没必要吧,',?'不可以吗。
  1. ((?:\w+\s*,??\s*)+) #考虑到一次声明多个变量的情况
复制代码

论坛徽章:
0
发表于 2013-06-10 10:25 |显示全部楼层
本帖最后由 gonedone 于 2013-06-10 10:38 编辑

可以 考虑下使用 (?(condition) THEN | ELSE)这样的结构,

论坛徽章:
0
发表于 2013-06-10 14:55 |显示全部楼层
回复 2# kk861123

的确,第4行的应该是?:,我发帖的时候写反了,但还是 有问题,对于local done, seq = Package( objid, obj) ,打印匹配的结果是:
get group: ('local', 'done1, seq1 ')

我理想的情况是:
get group: ('local', 'done1', 'seq1')

我的想法是先匹配done1这个模式,然后递归匹配后面的,但想不到什么方法。
另外,当匹配到local function GetRandomRet(randomNum) 这行时,还是会卡住了~~~~有什么方法吗?

   

论坛徽章:
0
发表于 2013-06-10 17:05 |显示全部楼层
回复 4# wfnh


  再对得到的'done1, seq1 '做split不就可以了...

论坛徽章:
0
发表于 2013-06-10 18:55 |显示全部楼层
本帖最后由 wfnh 于 2013-06-10 18:58 编辑

回复 5# kk861123

可以肯定是可以~~~但是要另外处理~~~我在想只通过正则,是否可以达到同样的效果~

而且卡住的问题还存在··额··


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2013-06-13 15:35 |显示全部楼层
本帖最后由 mcshell 于 2013-06-13 15:38 编辑
  1. (?=.*?=)(?:local)?(\w*),?
复制代码
回复 1# wfnh


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP