【问题标题】:Lua Pattern MatchingLua 模式匹配
【发布时间】:2013-01-19 17:48:36
【问题描述】:

我有一个从 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 客户\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 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}}

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 I\embo0 \embo see\embo0 \embo it\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 \embo 尝试\embo0 \embo a\embo0 \embo 会议。\embo0\f1\par {*\lyncflags rtf=1}}

【问题讨论】:

  • 欢迎来到 StackOverflow!您给出的正则表达式会产生什么输出?
  • 如果最终您对模式匹配解决方案仍然不满意,您可能需要查看lpeg

标签: lua lua-patterns


【解决方案1】:

Lua 模式没有 or 运算符 (|) 或可选分组 ((?:...)?)。这样的事情可能会奏效:

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

将返回:

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

第一个 gsub 删除所有 {} 对及其内容,第二个 gsub 删除所有 rtf 标签(尽管其中似乎有一些允许空格,因此您可能需要调整模式) .

【讨论】:

  • 这很接近,但在某些情况下我得到:尝试索引一个零值作为我的错误
  • 附加信息添加到上面的问题陈述中。在电子邮件地址缩进的地方,我的格式中有两个大于字符。
  • 我很困惑:我没有遇到任何故障,也没有看到电子邮件地址。我得到的只是这三个消息:" works for me.. how about embedding pictures? "" I see it "" let's try a meeting. "
  • 您可以删除“大于”符号并使用类似 :gsub("%s+>?", " ") 的内容折叠空格。
  • 如果我传递了一个不包含任何 RTF 格式的字符串怎么办? s:match 是否仍然有效,还是我需要在此之前添加一些内容以检查格式?
【解决方案2】:

试试这个:

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... please close out of your old client and re-open
works for me.. how about embedding pictures?
I see it
let's try a meeting.

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2015-12-17
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多