2013-02-04 118 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

添加到上述问题陈述中的附加信息。在电子邮件地址缩进的地方,我的格式中有两个以上的字符。 –