由於工作的原因,寫了幾天lua。沒有培訓,沒有翻書。掃了一下官方文檔,開工。
我統計了一下我寫的lua代碼,多的時候有1100行。可能用高級方式五百行代碼即可。刪減了一些垃圾代碼,換用了一些高級手段。代碼量壓縮到了八百多行。
sh/lua/python最近的項目都有用,Python的語法有些操蛋,過於鬆散則是過於緊縮,而且沒有符號來限制和生命作用域,全依賴對齊真悲劇。一條語句,至少有幾十種不同的寫法。對於習慣了寫C和C++的人來說,簡直就是大災難。我現在知道爲什麼Python的性能這麼渣渣了,就是用性能給這麼垃圾的語法埋單了。shell則有很多細節需要注意的。例如if條件裏面的內容要一個空格隔開。【這點導致的bug真操蛋】
lua稍微好一點。很接近C語言。lua給我的印象很好。輕巧簡潔。
lua的正則式很精悍。當然,易用性方面和靜態語言比較還是有差距的。
我整理了一些關於lua正則式的資料,加了一些demo給各位。資料也大多是來自網絡和官方文檔。不過沒有找到原出處,所以未指明引用的資料來源。見諒!
關鍵字
lua的正則式保留的關鍵字如下( ) . % + - * ? [ ^ $
'%' 用作特殊字符的轉義字符
'%.' 匹配點;
'%%' 匹配字符 '%'。
值得注意的是,這裏沒有
\
/
轉譯和表達
%s 空白符
%p 標點字符
%c 控制字符
%d 數字
%x 十六進制數字
%z 代表0的字符
%a 字母
%l 小寫字母
%u 大寫字母
%w 字母和數字
上面字符類的大寫形式表示小寫所代表的集合的補集。例如,%A 非字母的字符。%S 表示非空字符
模式修飾符
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次;最長匹配 -- 先儘可能長地把本次匹配模式走完,再繼續下一個模式,
- 匹配前一字符0次或多次;最短匹配 -- 本次匹配模式每走一步,就考查下一個模式能否進入.
? 匹配前一字符0次或1次
^ 匹配字符串開頭
$ 匹配字符串結尾
轉義字符 '%' 不僅可以用來轉義特殊字符,還可以用於所有的非字母的字符。當對一個字符有疑問的時候,爲安全起見請使用轉義字符轉義他。
用 [] 創建字符集
[%w_] 匹配字母數字和下劃線
[01] 匹配二進制數字
[%[%]] 匹配一對方括號
在[]中使用連字符'-'
%d 表示 '[0-9]';
%x 表示 '[0-9a-fA-F]'
[0-7] 表示 '[01234567]'
在 [] 開始處使用 ^ 表示其補集:
[^0-7] 匹配任何不是八進制數字的字符;
[^\n] 匹配任何非換行符戶的字符。
[^%s] == %S
使用場景與舉例
提取匹配目標
{
"system": {
"release_date": "2015-04-25",
"md5sum": "dddddddddddddddddddddddddddddddd",
"path": "system",
"filename": "abc.tar"
},
"file": {
"uploadtime": "1999-12-29",
"md5sum": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"path": "updates",
"filename": "efg.pdf"
}
}
system中的path字段
function parsejson( str , separator )
local val
string.gsub(str,separator,function(c)val=c end)
return val
end
local path = parsejson(rawjs,".-system.-path.-:%s-\"(.-)%s-\"")
這裏說明一下正則式中的內容的由來. ☞ 任意字符