Сопоставление шаблонов Lua

У меня есть файл, полученный путем извлечения значений из диалога 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 Крейг...\embo0 \embo пожалуйста\embo0 \embo закрыть\embo0 \embo >out\embo0 \embo of\embo0 \embo your\embo0 \embo old\embo0 \embo client\embo0 \embo >и\embo0 \embo повторно открыть\embo0\f1\par {*\lyncflags rtf=1}}

Используя сценарии Lua, я пытаюсь удалить теги RTF и просто вытащить текст разговора. Итак, результат моей функции должен быть:

Крейг... пожалуйста, закройте свой старый клиент и снова откройте

Я пытался использовать string.gsub с регулярным выражением, чтобы сопоставить шаблоны и заменить их пустым пространством, чтобы оставить только текст, но это не работает. Вот код, который у меня есть для string.gsub:

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

Любые предложения будут ценны!

Дополнительный:

[email protected] @ 2013-01-18 17:48:03Z (КОМУ: [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 работает\embo0 \embo для\embo0 \embo me..\embo0 \embo как\ embo0 \embo about\embo0 \embo embedding\embo0 \embo картинки?\embo0\f1\par {*\lyncflags rtf=1}}

[email protected] @ 18.01.2013 17:48:57Z (КОМУ: [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 I\embo0 \embo см.\embo0 \embo it\embo0\f1\par {* \lyncflags rtf=1}}

[email protected] @ 2013-01-18 17:49:27Z (КОМУ: [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 давайте\embo0 \embo try\embo0 \embo a\embo0 \embo встреча.\embo0 \f1\par {*\lyncflags rtf=1}}


person Steve A    schedule 04.02.2013    source источник
comment
Добро пожаловать в StackOverflow! Какой вывод дает указанное вами регулярное выражение?   -  person andrewdotnich    schedule 05.02.2013
comment
Если, в конце концов, вы все еще не удовлетворены решением для сопоставления с образцом, вы можете проверить его lpeg   -  person hugomg    schedule 05.02.2013


Ответы (2)


В шаблонах Lua нет операторов or (|) или необязательных группировок ((?:...)?). Что-то вроде этого может работать:

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

вернусь:

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

Первый gsub удаляет все пары {} вместе с их содержимым, второй gsub удаляет все теги rtf (хотя, кажется, некоторые из них допускают пробелы, поэтому вам может потребоваться настроить шаблон).

person Paul Kulchenko    schedule 04.02.2013
comment
Это близко, но в некоторых случаях я получаю: Попытка проиндексировать нулевое значение как мою ошибку - person Steve A; 05.02.2013
comment
Дополнительная информация добавлена ​​к описанию проблемы выше. Там, где адреса электронной почты имеют отступ, в моем форматировании есть два символа больше. - person Steve A; 05.02.2013
comment
Я в замешательстве: я не получаю никаких сбоев и не вижу адресов электронной почты. Я получаю только эти три сообщения: " works for me.. how about embedding pictures? ", " I see it " и " let's try a meeting. ". - person Paul Kulchenko; 05.02.2013
comment
Вы можете удалить знаки больше чем и свернуть пробелы с помощью чего-то вроде этого :gsub("%s+>?", " "). - person Paul Kulchenko; 05.02.2013
comment
Что делать, если я получил строку, которая не содержит никакого форматирования RTF? Будет ли s:match по-прежнему работать или мне нужно что-то вставить перед этим, чтобы проверить форматирование? - person Steve A; 05.02.2013
comment
Вы можете либо проверить это, либо сделать что-то вроде этого: (s:match("{(.+)}") or ''):gsub("%b{}", ""):gsub("\\%w+", "") - person Paul Kulchenko; 05.02.2013

Попробуйте это:

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.

person Webrom    schedule 18.05.2019