2010-04-22 180 views
55

我目前正在學習lua。關於LUA模式匹配我發現下面的句子中的LUA文件在lua.org:Lua模式匹配與正則表達式的比較

不過,在Lua模式匹配是一個強大的工具,包括一些功能,都難以企及的標準POSIX實現。

正如我所熟悉的POSIX正則表達式,我想知道是否有任何共同的樣品,其中LUA模式匹配是「更好」相比,正則表達式 - 還是我誤解了一句?如果有任何常見的例子:爲什麼模式匹配和正則表達式更適合?

+0

鏈接到您在文檔中閱讀此內容的位置會很好 – g33kz0r 2013-02-11 02:02:23

+0

@ g33kz0r文檔位於:http://www.lua.org/pil/20.1.html引用來自第二段與:「不像其他幾種腳本語言,......)最後一句 – aurora 2013-02-11 13:16:14

回答

63

lua模式匹配比正則表達式「更好」嗎?

這並不是特別的例子,因爲Lua模式比POSIX正則表達式具有更高的信噪比。總體設計往往是可取的,而不是特別的例子。

這裏有一些因素有助於良好的設計:

  • 非常輕量級語法匹配通用字符類型,包括大寫字母(%u),十進制數(%d),空格字符(%s)等上。任何字符類型都可以使用相應的大寫字母來補充,因此%S模式可匹配任何非空格字符。

  • 引用是非常簡單和規則。引用字符是%,因此它總是與字符串引用字符\不同,這使得Lua模式比POSIX正則表達式(需要引用時)更容易閱讀。引用符號總是安全的,並且不需要引用字母,所以你可以按照該經驗法則而不是記住哪些符號是特殊的元字符。

  • Lua提供了「捕獲」,並可以返回多個捕獲作爲match調用的結果。這個界面比通過副作用捕獲子串或者有一些隱藏狀態必須被詢問才能找到捕獲要好得多。捕捉語法很簡單:只需使用圓括號。

  • Lua擁有一個「最短匹配」-修改器,可以與「最長匹配」*運算符一起進行。因此,例如s:find '%s(%S-)%.'可找到以空格開頭並且後跟一個點的非空格字符的最短序列。

  • Lua模式的表現力與POSIX「基本」正則表達式相當,沒有替換運算符|。你放棄的是與|「擴展」正則表達式。如果你需要這麼強大的表達能力,我建議你一直到LPEG,這樣就可以非常合理的價格爲你提供上下文無關文法的強大功能。

+0

感謝 - 大量的信息。我想我必須深入研究lua模式匹配,在我完全理解之前,引用句子的含義是什麼...... – aurora 2010-04-26 06:18:02

+4

與PCRE「節儉匹配」運算符不同,「最短匹配」修飾符不是「 *?」 ? – b0fh 2011-08-22 12:22:29

+3

還有'%bxy'匹配平衡的分隔符對,如括號或大括號。平衡括號匹配不能在POSIX正則表達式中完成。此外,還有前沿模式存在,但在Lua 5.1中沒有記錄,併成爲5.2中記錄的特徵。 [wiki說](http://lua-users.org/wiki/FrontierPattern)「前面的模式'%f'後面跟着一組檢測從」不在設置「到」在設置「的轉換。」這個操作是可能的,但在正則表達式中更詳細。 – RBerteig 2011-08-25 00:38:21

6

http://lua-users.org/wiki/LibrariesAndBindings包含功能列表,包括正則表達式庫,如果你想繼續使用它們。

爲了回答這個問題(並且我注意到我絕不是Lua guru),該語言在嵌入式應用程序中使用有着很強的傳統,其中一個完整的正則表達式引擎會過度增加代碼的大小在平臺上使用,有時比Lua庫本身的大得多。

[編輯]我剛剛在Lua哪裏,這是通過語言的原則之一描述編程的在線版本(學習語言的優秀資源)發現:見下文 [/編輯]評論

我個人發現,默認模式匹配Lua提供的滿足我的大部分正則表達式需求。你的旅費可能會改變。

+0

http://www.lua.org/pil/20.1.html – 2010-04-22 18:47:51

+0

好 - 我認爲這不僅僅是大小,我讀,lua的模式匹配庫大約相當於500個loc,與〜4000 loc的regexp庫相比 - 這很酷,但我認爲它也是關於便利性的:我用正則表達式做了很多,我知道這個東西可以得到很多複雜和複雜 - 所以:有沒有其他的功能,使盧阿的模式匹配更方便或更容易使用或... ...除了祿的posix正則表達式?請記住:它是關於學習不燃燒 – aurora 2010-04-23 05:24:24

+0

我同意諾曼的發佈(這就是爲什麼如果我有名譽,他會得到我的讚賞!)。除了使用它的個人美學之外,我不能添加更多的東西 - 它對我來說只是感覺更好。再次,因人而異:) FWIW,當我正則表達式的不同/模式匹配方式(SED與Lua中,例如),它使我頭痛,經常跑的文檔之間反彈。我傾向於留在我最常用的工具中,這恰好是Lua。 – 2010-04-23 17:22:56

1

好吧,這個討論只是一個輕微noob注意;我特別得到了由該頁面困惑:

SciTE Regular Expressions

因爲那人說\s匹配的空白,因爲我從其他的正則表達式語法知道......所以我想它的外殼:

$ lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> c=" d" 
> print(c:match(" ")) 

> print(c:match(".")) 

> print(c:match("\s")) 
nil 
> print("_".. c:match("[ ]") .."_") 
_ _ 
> print("_".. c:match("[ ]*") .."_") 
_ _ 
> print("_".. c:match("[\s]*") .."_") 
__ 

嗯......似乎\s在這裏沒有被識別 - 所以這個頁面可能指的是Scite的查找/替換中的正則表達式 - 而不是Lua的正則表達式語法(scite也使用)。

然後我重讀lua-users wiki: Patterns Tutorial,並開始獲取有關轉義字符是%,不\@NormanRamsey的答案的評論。所以,試試這個:

> print("_".. c:match("[%s]*") .."_") 
_ _ 

......確實有效。因此,正如我原先以爲Lua的「模式」與Lua的「正則表達式」是不同的命令/引擎,我想有一種更好的方式來說這是:Lua的「模式」 Lua特定的「常規表達「語法/引擎(換句話說,其中不存在兩個:)

乾杯!