2013-02-04 51 views
3

我有一個文件,可以從具有RTF格式標記的Microsoft Lync對話中提取值。一個例子文件將是這樣的:Lua模式匹配

{\ RTF1 \ fbidis \ ANSI \ ansicpg1252 \ deff0 \ nouicompat \ deflang1033 {\ fonttbl {\ F0 \ fnil \ fcharset0>瀨越UI;} {\ F1 \ fnil瀨越UI ;}} {\ colortbl; \ red0 \ green0 \ blue0;} {* \ generator Riched20 15.0.4420} {* \ mmathPr \ mwrapIndent1440} \ viewkind4 \ uc1 \ pard \ cf1 \ embo \ f0 \ fs20 Craig。 .. \ embo0 \ embo \ embo0 \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \ embo \打開\ embo0 \ f1 \ par {* \ lyncflags rtf = 1}}

使用Lua腳本我試試刪除RTF標籤,然後取出對話文本。因此,我的函數的結果應該是:

克雷格......請閉上你的老客戶了,然後重新打開

我使用string.gsub用正則表達式匹配嘗試模式並用空格替換它們以僅留下文本但它不起作用。這裏是我到目前爲止的代碼字符串.gsub:

result = string.gsub(s, "\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?", " ") 

任何建議將不勝感激!

附加:

[email protected] @ 2013年1月18日17:48:03Z(TO:[email protected]

{\ RTF1 \ fbidis \ ansi \ ansicpg1252 \ deff0 \ nouicompat \ deflang1033 {\ fonttbl {\ f0 \ fnil \ fcharset0 Segoe UI;} {\ f1 \ fnil Segoe UI;}} {\ colortbl; \ red0 \ green0 \ blue0;} {* \ generator Riched20 15.0.4420} {* \ mmathPr \ mwrapIndent1440} \ viewkind4 \ uc1 \ pard \ cf1 \ embo \ f0 \ fs20 works \ embo0 \ embo for \ embo0 \ embo me .. \ embo0 \ embo how \ embo0 \ embo about \ embo0 \ embo embedding \ embo0 \ embo pictures?\ embo0 \ f1 \面值 {* \ lyncflags RTF = 1}}

[email protected] @ 2013年1月18日17:48:57Z(TO:[email protected]

{\ RTF1 \ fbidis \ ANSI \ ansicpg1252 \ deff0 \ nouicompat \ deflang1033 {\ fonttbl {\ F0 \ fnil \ fcharset0瀨越UI;} {\ F1 \ fnil瀨越UI;}} {\ colortbl; \ red0 \ green0 \ blue0;} {* \ generator Riched20 15.0.44 20} {* \ mmathPr \ mwrapIndent1440} \ viewkind4 \ uc1 \ pard \ cf1 \ embo \ f0 \ fs20 I \ embo0 \ embo請參閱\ embo0 \ embo it \ embo0 \ f1 \ par {* \ lyncflags rtf = 1} }

[email protected] @ 2013年1月18日17:49:27Z(TO:用戶2 @資本。COM)

{\ RTF1 \ fbidis \ ANSI \ ansicpg1252 \ deff0 \ nouicompat \ deflang1033 {\ fonttbl {\ F0 \ fnil \ fcharset0瀨越UI;} {\ F1 \ fnil瀨越UI;}} {\\ colortbl; \ red0 \ green0 \ blue0;} {* \ generator Riched20 15.0.4420} {* \ mmathPr \ mwrapIndent1440} \ viewkind4 \ uc1 \ pard \ cf1 \ embo \ f0 \ fs20 let's \ embo0 \ embo try \ embo0 \ EMBO一個\ embo0 \ EMBO會議。\ embo0 \ F1 \面值 {* \ lyncflags RTF = 1}}

+0

歡迎來到StackOverflow!你給出的正則表達式的輸出結果是什麼? – andrewdotnich

+0

如果最終您仍然不滿意模式匹配解決方案,則可能需要檢查[lpeg](http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html)庫 – hugomg

回答

2

的Lua圖案不必or運營商(|)或可選的分組((?:...)?)。這樣的事情可能工作:

s:match("{(.+)}"):gsub("%b{}", ""):gsub("\\%w+", "") 

將返回:

" Craig... please close >out of your old client >and re-open " 

首先gsub刪除所有對{}和當中的內容,第二gsub刪除所有RTF標籤(雖然似乎有一些允許其中有空格,所以你可能需要調整模式)。

+0

即將結束,但在某些情況下,我會得到:嘗試將一個零值作爲我的錯誤 –

+0

您是否有示例? –

+0

添加到上述問題陳述中的附加信息。在電子郵件地址縮進的地方,我的格式中有兩個以上的字符。 –