2010-11-30 32 views
5

我一直在玩這個一個小時或拖車,並發現自己在與Lua模式匹配實用程序的路障。我試圖匹配一個字符串中的所有引用文本,並在需要時替換它。引用文本的正確Lua模式是什麼?

我想出了到目前爲止的模式是:(\ [\「\'])(.-)%1

這工作在某些情況下,但是,並非所有的案件:

Working: "This \"is a\" string of \"text to\" test with" 

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h" 

在不工作的例子,我想它匹配(我做的,我得到想要的相匹配的功能,我只是在尋找一種模式與GSUB和好奇,如果使用Lua的模式可以做到這一點):

string 
a" string" of 
is' a" string" of' text 
test 
his "is' a" string" of' text" to "test" wit 

我將繼續暫時使用我的功能,但我很好奇,如果有我可以/應該使用的模式,我只是缺少一些模式。

(幾個編輯B/C我忘了stackoverflows在格式化) (另一個編輯,使非HTML的例子,因爲它導致我試圖解析HTML假設)

+0

[RegEx match open tags tags except XHTML self-contained tags]可能重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2015-04-10 18:01:32

回答

5

嘗試匹配逃脫,使用正則表達式引用的文字就像是試圖刪除使用割草機從現場雛菊(也是唯一的淑女們)。

我提出,得到相匹配的功能我渴望

這是正確的舉措。

我很好奇,如果一個LUA模式可以做到這一點

從實用的角度來看,即使模式能做到這一點,你不想。從理論的角度來看,您試圖找到一個雙引號,前面加上偶數的反斜槓。這絕對是一個普通的語言,你想要的正則表達式會像以下(LUA引用慣例)

[[[^\](\\)*"(.-[^\](\\)*)"]] 

並會被引用的字符串#2。但Lua模式是而不是完整正則表達式;尤其是,您不能在加括號的模式之後加上*。 所以我的猜測是,這個問題不能用Lua模式來解決,但是因爲Lua模式在自動機理論中不是標準的東西,所以我不知道你可以使用任何證明技巧證明它。

0

你應該NOT試圖用正則表達式解析HTML,HTML和XML是而不是正規語言,並且不能用正則表達式成功操作。您應該使用專用的HTML解析器。 Here are lots of explanations why

+0

我無法忽略html,它只是我從我打開的隨機文件中抓取的測試字符串。我所關心的是引號 – Wolftousen 2010-11-30 20:54:52

+0

然後我會建議使用非HTML示例並刪除含糊不清的內容 – 2010-11-30 21:09:06

+0

你是否將````和```等同作爲引號?如果是這樣,你會如何期待你的'不工作'示例解析? 例如,''是'text'的'一個字符串'包含重疊的引號,我們是否應該找到''是''和`''是'text'還是''一個「字符串」,還是全部三個?如果是後者,則需要兩次完成該操作。 – Mud 2010-11-30 22:58:39

2

問題與逃脫的報價是,一般來說,如果有奇數個引號之前反斜槓,那麼它的逃跑了,如果有偶數,事實並非如此。我不相信Lua模式匹配足夠強大來表示這種情況,所以如果你需要像這樣解析文本,那麼你應該尋找另一種方式。也許你可以遍歷字符串並解析它,或者你可以依次找到每個引號並向後讀,計數反斜槓,直到找到一個非反斜線字符(或字符串的開頭)。

如果您絕對必須使用模式出於某種原因,您可以嘗試在多步驟過程中執行此操作。首先,gsub連續出現兩個反斜槓,並用一些標記值替換它們。這必須是一個字符串中尚未出現的值。如果您知道此字符串不包含非可打印字符,則可以嘗試類似「\ 001」的內容。無論如何,一旦你連續替換了所有的兩個反斜槓序列,剩下的任何反斜槓都會逃脫下一個字符。現在你可以應用你的原始模式,最後你可以用兩個反斜槓替換你的哨兵值的所有實例。

1

Lua的模式語言適用於很多簡單的情況。它至少有一個你在典型的正則表達式包中找不到的技巧:匹配平衡括號的方法。但它也有其限制。

當超過這些限制時,我達到LPeg。 LPeg是Lua的一個Parsing Expression Grammer的實現,由Lua的原創作者之一實現,所以對Lua的改編工作做得相當好。 PEG允許指定從簡單模式到完整語言語法的任何內容。 LPeg將語法編譯爲一個字節碼並非常有效地執行。