1. Introdução

RTF (Rich Text Format) é uma dos formatos para representação de documentos (textos formatados e gráficos) preferidos pelos desenvolvedores. Uma de suas características mais atraentes é o fato de que, “por trás dos panos”, um documento codificado neste formato nada mais é do que um arquivo texto comum acrescido dos comandos RTF. Se você não sabia disto e desejar fazer um teste, utilize o exemplo abaixo. Ele produz um documento de uma linha, contendo a frase “oi amigos” na fonte Verdana. Basta digitar o exemplo no NOTEPAD ou outro editor comum, salvar com a extensão “.RTF”. Depois você poderá abri-lo no Word ou OpenOffice para ver o resultado.

Listagem 1: Exemplo de documento RTF

{\rtf1\ansi\deff0
{\fonttbl {\f0 Verdana;}}
\f0\fs20 oi amigos!
}

2. Removendo Comandos RTF com Expressão Regular - Versão Básica

É muito comum encontrar aplicações que gravem texto no formato RTF em colunas VARCHAR ou CLOB de um banco de dados. Muitas vezes os dados são obtidos a partir de um componente rich text de um formulário da aplicação, que possibilita ao usuário digitar o texto escolhendo fontes, cores, etc. Exemplos: texto de um atendimento de help desk, texto de um currículo, etc. Em muitas situações práticas, pode acontecer a necessidade de, ao recuperar o conteúdo do campo, ser necessário remover os comandos RTF para ficar apenas com o “texto puro” do documento.

Neste primeiro o artigo da série, vamos apresentar (e explicar!) uma expressão regular “maceteada” que tem por objetivo tirar todas as tags RTF de uma string, excetuando os acentos (trataremos este caso no próximo artigo). De antemão gostaria de avisar que a expressão não é infalível. Porém é bastante útil na maioria dos casos, além de representar um bom ponto de partida para quem desejar criar algo mais elaborado. A expressão regular “assustadora” é apresentada abaixo:

Listagem 2: Expressão Regular para Remoção de RTF

\{?\\[[:alnum:]]+\s?([[:alnum:]]*;)?\}?

Para elaborar a expressão, eu parti do pressuposto que todo comando RTF começa com uma barra invertida " \ " e termina em uma das seguintes três situações:

  1. Quando outro comando é iniciado (ou seja, quando outra barra invertida aparece); ou
  2. Quando ocorre um espaço em branco; ou
  3. Quando ocorre um ponto-e-vírgula.

É importante registrar também que no formato RTF chaves " { " " } " podem ser usadas para colocar os comandos um dentro do outro. Abaixo apresento uma “tradução” da “expressão assustadora”.

Tradução: Remover qualquer parte da string que case com o seguinte padrão: Representação na Expressão Regular:
1. Comece ou não com abre chaves "{ " \{?
2. Tenha, a seguir, obrigatoriamente uma barra invertida " \ " \\
3. Tenha depois de um a N caracteres alfanuméricos [[:alnum:]]+
4. A seguir tenha ou não um espaço em branco \s?
5. A seguir tenha ou não um conjunto formado por:
- 0 a N caracteres finalizados por um ponto e vírgula " ; "
([[:alnum:]]*;)?
6. Finalize ou não com fecha chaves "}" \}?

Alguns exemplos de padrões que conseguem ser removidos pela expressão:

  • {\rtf1 : começa com "{", depois tem "\" depois tem 4 caracteres alfanuméricos.
  • \deff0 : começa com "\" depois de 5 caracteres alfanuméricos.
  • \par } : começa com "\", depois tem 3 caracteres alfanuméricos, depois tem espaço em branco, depois tem "}".
  • \par } começa com "\", depois tem 3 caracteres alfanuméricos, depois tem espaço em branco, depois tem "}".
  • \fcharset0 Tahoma;} começa com "\", depois tem 9 caracteres alfanuméricos, depois tem espaço em branco, depois tem o conjunto (6 caracteres alfanuméricos + " ; "), depois tem "}".

3. Próximo Artigo

No próximo artigo será apresentada uma aplicação prática para a expressão em uma instrução SQL do Oracle e também uma idéia para realizar o tratamento dos caracteres acentuados.