Lua模式匹配

3
我有一个文件,是从Microsoft Lync对话中提取具有RTF格式标记的值而得到的。例如,一个文件可能如下所示:

{\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 Craig...\embo0 \embo please\embo0 \embo close\embo0 \embo>out\embo0 \embo of\embo0 \embo your\embo0 \embo old\embo0 \embo client\embo0 \embo>and\embo0 \embo re-open\embo0\f1\par {*\lyncflags rtf = 1}}

使用Lua脚本,我正在尝试删除RTF标记并仅提取对话文本。因此,我的函数的结果应该是:

Craig...请关闭您的旧客户端并重新打开

我尝试过使用string.gsub和正则表达式来匹配模式并用空格替换它们以仅保留文本,但它并没有起作用。以下是我目前所拥有的用于string.gsub的代码:
result = string.gsub(s, "\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?", " ")

任何建议都将不胜感激!
补充: user1@capital.com @ 2013-01-18 17:48:03Z(TO:user2@capital.com)
{\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 行得通。\embo0 如何嵌入图片?\f1\par {*\lyncflags rtf=1}} user1@capital.com @ 2013-01-18 17:48:57Z(TO:user2@capital.com)
{\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 我明白了。\embo0\f1\par {*\lyncflags rtf=1}} user1@capital.com @ 2013-01-18 17:49:27Z(TO:user2@capital.com)
{\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 让我们试一次会议。\embo0\f1\par {*\lyncflags rtf=1}}

欢迎来到StackOverflow!你所给出的正则表达式会产生什么输出结果? - andrewdotnich
如果最终您仍然对模式匹配的解决方案不满意,您可能需要检查lpeg库。 - hugomg
2个回答

2
Lua模式匹配不支持或运算符(|)或可选分组((?:...)?)。可以尝试使用类似以下的方式进行匹配:
s:match("{(.+)}"):gsub("%b{}", ""):gsub("\\%w+", "")

将返回:

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

首先,gsub 函数会删除所有的 {} 及其内容。第二个 gsub 函数会删除所有 RTF 标签(虽然有些标签中允许包含空格,所以你可能需要微调正则表达式)。


这很接近了,但在某些情况下我会得到:尝试将空值索引为我的错误。 - Steve A
以上问题陈述中添加了额外的信息。当电子邮件地址缩进时,我的格式中有两个大于号字符。 - Steve A
我很困惑:我没有收到任何失败的消息,也没有看到电子邮件地址。我只收到了这三条消息:“'works for me.. how about embedding pictures?'”,“'I see it'”和“'let's try a meeting.'”。 - Paul Kulchenko
你可以使用类似这样的代码 :gsub("%s+>?", " ") 来移除“大于”符号并折叠空格。 - Paul Kulchenko
如果我传递的字符串不包含任何RTF格式,那么会发生什么?s:match仍然有效吗?还是需要在此之前放置一些内容以检查格式? - Steve A
你可以检查它,或者像这样做:(s:match("{(.+)}") or ''):gsub("%b{}", ""):gsub("\\%w+", "") - Paul Kulchenko

0

试试这个:

local s = '{\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 Craig...\embo0 \embo please\embo0 \embo close\embo0 \embo >out\embo0 \embo of\embo0 \embo your\embo0 \embo old\embo0 \embo client\embo0 \embo >and\embo0 \embo re-open\embo0\f1\par {*\lyncflags rtf=1}}\n'
    ..'{\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\par {*\lyncflags rtf=1}}\n'
    ..'{\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 I\embo0 \embo see\embo0 \embo it\embo0\f1\par {*\lyncflags rtf=1}}\n'
    ..'{\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 let\'s\embo0 \embo try\embo0 \embo a\embo0 \embo meeting.\embo0\f1\par {*\lyncflags rtf=1}}\n'
local text = string.gsub(s, '{(.-)}[}]?', ''):gsub('embo',''):gsub('0',''):gsub('iewkind4uc1 pardcf1',''):gsub('1par',''):gsub('s2',''):gsub('>','')
print(text)

输出 Craig...请关闭您的旧客户端并重新打开,这对我有效。嵌入图片怎么样?我看到了。让我们试试开个会议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接