最近的工作是项目移植

需要把大量的lua脚本转译成js脚本(cocos2dx升级cocoscreator)

因此也学习了一下强大的正则表达式

通过notepad++,使用宏录制,正则表达式替换的方法

实现了半自动化脚本转译

原文地址:http://www.cnblogs.com/billyrun/articles/6576248.html

 

具体来说

简单的部分比如local->var可以用基本的替换操作

而表转数组/表转关联数组

以及匿名函数/本地函数/成员函数的转换

就必须依靠正则表达式了

 

首先替换lua数组{}为js数组[]

这里只处理真数组,不处理其他种类表

匹配字\{([^=\{\}]+)\}替换[\1] #说明:确保{}内没有=号,真数组

--转换前
local arr1 = {1,2,3,4,5,6}
local arr2 = {
1,
2,
3,
4,
5,
6}
//转换后
local arr1 = [1,2,3,4,5,6]
local arr2 = [
1,
2,
3,
4,
5,
6]

之后替换lua表为js关联数组

匹配字(\{[^=\{\}]+)=([^\}]+\})替换\1:\2 #说明:左边不能包含=号右边可以包含,按顺序替换表中的=为:

目前不支持表嵌套

--转换前
local tb1 = {t1 = 1 , t2=2, t3=3}
local tb2 = {
    t1 = 1 , 
    t2=2, 
    t3=3
}
//转换后
local tb1 = {t1 : 1 , t2:2, t3:3}
local tb2 = {
    t1 : 1 , 
    t2:2, 
    t3:3
}

ps.为什么有先有后?因为lua里面只有table会用到{}

所以只用先后转为js数组和js关联数组,就可以保证这两者转译正确

 

另外还有一些简单的办法

可以在function后面加上{等等(单行匹配)

匹配字function (.+\))替换function \1{

 

正则表达式匹配代码中的中文硬编码

'[^x00-xff^)^'^\s]

匹配中英文换行

^\r\n[35a-zA-Z][a-zA-Z0-9_: ,-?'()<>]*\r\n\r\n

^[35a-zA-Z][a-zA-Z0-9_: ,-?'()<>]*\n\n

 

参考资料

http://deerchao.net/tutorials/regex/regex.htm