lua正則式

由於工作的原因,寫了幾天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

使用場景與舉例

提取匹配目標

例如,你沒有用第三方的json.lua這類blabla的lua庫,也不想調用C/C++等其他語言。想解析json中的某一個字段。即提取目標。這時候需要用到
( )
在圓括號中寫匹配目標。
例如如下json解析
{
    "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-\"")
這裏說明一下正則式中的內容的由來
".-system.-path.-:%s-\"(.-)%s-\""
. ☞ 任意字符
-  ☞ 匹配前一規則0次或多次。最短匹配, 每次匹配完都檢驗下一個匹配規則是否滿足( * 是最長匹配)
system ☞ 匹配system字符。.-system 的含義是匹配若干任意字符,直到system字符,則匹配system字符。此處用來匹配system前面的 空格 { "
.-path ☞ 匹配零個或者多個任意字符,直到出現path字符。
.-: ☞ 匹配零個或多個任意字符,直到出現冒號 : 
%s-\" ☞ 匹配零個或者多個空格,直到出現雙引號 "
(.-)%s-\" ☞ 這裏的圓括號先忽略,匹配零個或多個任意字符,直到出現空格,匹配零個或者多個空格直到出現雙引號 " 
現在可以描述這裏圓括號的作用了。圓括號中的內容是會被傳遞到回調函數中作爲參數的。即會被提取返回。
細細體會這個例子,剩下的就能夠看文檔看明白了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章