Como criar as entradas da lista de substituição

Muitas vezes, criar expressões regulares é uma tarefa aborrecida e difícil, mas para o que usamos aqui, as expressões não costumam ser difíceis de criar. O difícil é criar uma que não aceite palavras que não deve, enquanto aceita as palavras que queremos. Assim, nesta página, vou abordar a criação de expressões regulares e como podemos manipular as palavras encontradas pelo FoxReplace. Também irei abordar a criação de expressões que representem os sites sobre as páginas dos quais queremos fazer as substituições. No fim da página encontram-se referências para ajudar no estudo e criação de expressões regulares.

Por favor, se criarem uma expressão que represente o campo lexical de palavras ainda não definidas na lista de substituição, não se esqueçam de a partilhar, de modo a que possa ser adicionada à lista oficial.

Entradas das expressões regulares

A sintaxe das expressões regulares está sempre dependente do sistema que as vai interpretar, por isso nesta página vou indicar-vos o que precisam de saber para criar expressões regulares válidas e que sejam aceites pelo FoxReplace. Uma vez que não é preciso muito para criar expressões que sirvam o efeito que pretendemos, ou seja, expressões que reconheçam palavras escritas em acordês, vou apenas indicar o essencial para o fazerem, ficando outras especificidades de fora da explicação.

Para efeitos de pedagogia, vamos fazer isto com recurso a um exemplo real; vamos tentar passar para uma expressão regular palavras do campo lexical da palavra coleção. Fazem parte do campo lexical de coleção palavras como coleções, colecionar, colecionador, coleciono, colecionista, coletar e coletânea. Para tornar mais concisa as explicações, vou-me referir a uma qualquer sequência de letras/caracteres como string, que é um termo comum usado em computação.

Para começar, devemos ver o que é que há em comum entre todas estas palavras, ou então entre palavras inerentemente semelhantes. É fácil ver que o início é igual para todas as palavras; todas começam por “cole”. Então vamos criar a sub-string (cole). Por que é que está entre parêntesis? Vamos ver isso mais tarde, para já vamos deixar assim. Bom, a expressão (cole) vai apanhar todas as palavras que contenham a string cole. Como é óbvio, isto não chega, pois assim arriscamo-nos a apanhar palavras como colear ou a própria palavra cole (e.g. “Onde quer que cole isto?”). Então temos de expandir a expressão actual. Bom, aparentemente não há mais palavras na Língua Portuguesa que tenham um ç logo a seguir a um cole, por isso podemos criar uma expressão assim: (cole)(ç). Esta expressão já reconhece as palavras coleção e coleções, mas só para termos a certeza que não apanhamos inesperadamente nenhuma palavra parecida, vamos dizer que depois do ç podemos ter um ã ou um õ. Para isso usamos o conjunto de caracteres, representado pelos parêntesis rectos [ e ]. Por exemplo, a expressão [xyz] representa apenas um e só um dos caracteres que se encontrem dentro dos parêntesis rectos. Assim, a expressão [xyz] significa “ou x, ou y, ou z“.

Assim, temos agora a expressão (cole)(ç[ãõ]). Vamos agora para palavras como colecionar, colecionador, coleciono e colecionista. Para além da sub-string (cole), o que é que falta para que estas palavras sejam aceites? Talvez a sub-string cion? Vamos adicioná-la: (cole)(cion|ç[ãõ]). Reparem que existe um “|” entre cion e ç[ãõ]. O “|” é o operador ou, pelo que (cion|ç[ãõ]) significa “ou cion ou ç[ãõ]“.

ATENÇÃO: Não façam confusão entre o conjunto de caracteres, representado pelos parêntesis rectos [ ], e o operador ou, representado pela barra vertical |; são usados de maneira diferente! Basicamente, a barra vertical suporta expressões e os parêntesis rectos apenas suportam caracteres. Por exemplo, escrever “[mário!]” é o mesmo que escrever “m|á|r|i|o|!“, que significa “ou m, ou á, ou r, ou i, ou o, ou !“, ou seja, apenas um dos caracteres vai ser seleccionado. Por outro lado, escrever “mário|maria” significa “ou mário ou maria“.

Bom, sendo assim, a expressão (cole)(cion|ç[ãõ]) já reconhece palavras como coleção, coleções, colecionar, colecionador, coleciono e colecionista. Falta palavras que depois de cole tenham um t. Dito isto, podemos criar a expressão (cole)(t|cion|ç[ãõ]), que já aceita palavras como coletar e coletânea! Fantástico, certo!? Não, nem por isso. Se repararem, a expressão também reconhece a palavra colete. É verdade que colete é uma forma verbal do verbo coletar (e.g. “Espero que ele colete tudo”), mas também é verdade que colete no sentido de peça de vestuário é largamente mais utilizada que no exemplo dado. Sendo assim, vamos fazer esta cedência e dizer que não queremos que colete seja reconhecido pela expressão; afinal, não queremos que em vez de colete ou colete-de-forças nos apareça depois escrito colecte ou colecte-de-forças.

Para isto, vamos usar a negação de caracteres. A negação de caracteres funciona e usa-se de maneira oposta ao conjunto de caracteres. A negação de caracteres usa-se colocando um acento circunflexo (^) imediatamente após o primeiro parêntese recto. Por exemplo, enquanto que o conjunto de caracteres [xyz] significa “ou x, ou y, ou z“, a negação de caracteres [^xyz] significa “qualquer um que não x, nem y, nem z“.

Assim, se queremos que a nossa expressão actual não reconheça palavras que tenham um e após o t, temos de adicionar a sub-string [^e] após o t, ou seja: (cole)(t[^e]|cion|ç[ãõ]).

E pronto, poderíamos dizer que a expressão está pronta… mas não seria verdade, apesar de estar quase acabada. Se repararem, esta expressão só reconhece palavras que apenas contenham minúsculas. O que acontece se numa página estiver a palavra Coleção ou COLEÇÃO? Nada, a palavra não é reconhecida. É verdade que o FoxReplace tem a opção de ignorar a capitalização das letras, mas depois nas substituições isso teria um resultado indesejável. Para resolver este problema vamos ter de fazer duas coisas: indicar que a primeira letra da expressão pode ser uma maiúscula ou uma minúscula, e criar outra expressão que apenas aceite palavras escritas só com letras maiúsculas. Para o primeiro caso é fácil; fazemos uso do conjunto de caracteres: ([cC]ole)(t[^e]|cion|ç[ãõ]). Para o segundo caso, a nova expressão será (COLE)(T[^E]|CION|Ç[ÃÕ]).

E pronto, agora sim, temos as expressões regulares finais para as palavras que queríamos identificar:

  • ([cC]ole)(t[^e]|cion|ç[ãõ]), para palavras como coleção, coleções, colecionar, colecionador, coleciono, colecionista, coletar e coletânea;
  • (COLE)(T[^E]|CION|Ç[ÃÕ]), para as mesmas palavras mas quando escritas só com maiúsculas.

Mas o tutorial não se fica por aqui. Falta explicar o porquê dos parêntesis curvos. Estes parêntesis servem para separar a expressão regular em sub-expressões, de modo a que possamos mais tarde referenciá-las. Confusos? É normal. Vou dar um exemplo prático.

Na string da expressão ([cC]ole)(t[^e]|cion|ç[ãõ]) temos duas sub-strings. A primeira é [cC]ole e a segunda é t[^e]|cion|ç[ãõ], pois estavam ambas entre parêntesis. Isto serve para que agora possamos dizer ao FoxReplace para colocar um c entre as duas sub-strings. Isto faz-se dizendo que queremos substituir a expressão ([cC]ole)(t[^e]|cion|ç[ãõ]) pela expressão $1c$2. É assim que se faz referência às sub-strings da expressão regular: escrevendo $n, onde n é o número da sub-string. No nosso caso queremos que, quando o FoxReplace apanhar uma das palavras reconhecidas pela expressão regular, que a substitua pela primeira parte dessa palavra (pode ser cole ou Cole), seguida dum c, seguida do resto da palavra (pode ser cionar, cionador, tar, ção, ou qualquer outra que respeite a expressão). Assim, quando as palavras coleções, colecionar, colecionador, coletar, coletânea ou outras semelhantes forem encontradas num site, as mesmas serão substituídas por colecções, coleccionar, coleccionador, colectar ou colectânea, respectivamente.

Já agora, relativamente a sub-strings encadeadas, quando fazemos referência a uma sub-string, apenas conseguimos fazer referência às sub-strings com os parêntesis curvos mais externos. Por exemplo, se em vez de ([cC]ole)(t[^e]|cion|ç[ãõ]) tivéssemos a expressão regular equivalente ([cC]ole)(t[^e]|cion|ç(ã|õ)), continuávamos a poder fazer referência apenas a duas sub-strings, e não a três, sendo que $1 = [cC]ole e $2 = t[^e]|cion|ç(ã|õ). Não é possível fazer referência à sub-string ã|õ, pois existe outra que lhe é mais externa, que é t[^e]|cion|ç(ã|õ).

Já agora, relativamente a sub-strings encadeadas, quando fazemos referência a uma sub-string, a referênciação é feita sequencialmente e independentemente do grau de encadeamento da sub-string. Por exemplo, se em vez de ([cC]ole)(t[^e]|cion|ç[ãõ]) usássemos a expressão regular equivalente ([cC](ole))(t[^e]|cion|ç(ã|õ)), podíamos agora fazer referência até 4 sub-strings em palavras com um ã ou um õ precedidos de um ç. Por exemplo, aplicando essa expressão contra a palavra coleção, teríamos que:

  • $1 = cole
  • $2 = ole
  • $3 = çã
  • $4 = ã

Podemos agora adicionar as expressões à lista de substituição. Não esquecer de indicar que a expressão é uma expressão regular e que queremos que haja diferenciação entre maiúsculas e minúsculas:

Inserir uma expressão regular à lista de substituição

Inserir uma expressão regular à lista de substituição


Há só mais um ponto que é importante e que não foi abordado, que é o símbolo \b (inclui a barra invertida). Este símbolo representa o fim de palavra, o qual é representado “graficamente” por caracteres como o espaço, a quebra de linha (como quando se dá um Enter), um sinal de pontuação ou o fim de string. Um exemplo de uso deste símbolo é na expressão \b([rR]u)(tura), que representa palavras como Rutura e ruturas. Se o \b não fizesse parte da expressão, então palavras como estrutura acabariam por ser substituídas por algo como estruptura, que é um comportamento indesejável…

E pronto, isto são os conteúdos básicos para a criação de expressões regulares capazes de serem interpretadas pelo FoxReplace. Na verdade é possível criar expressões muito mais complexas com mais operadores e opções, mas para o que pretendemos aqui, estes conteúdos chegam. Também é de notar que é possível e normal existir mais que uma expressão regular para a mesma solução, como já deu para perceber pelo exemplo das referências a sub-strings dado anteriormente. Para mais informações relativas à criação de expressões regulares como estas, consultem a secção Ajudas e referências, abaixo, e não deixe de consultar as tabelas com as expressões adicionadas até ao momento.

Entradas dos sites afectados

Como é óbvio, também não se podem definir todas as páginas de todos os sites que queremos ver o FoxReplace a fazer substituições. Isso seria ridículo e improdutivo, pelo que de cada vez que quiséssemos ler uma notícia ou um post novo que estivessem escritos em acordês teríamos de primeiro adicionar o endereço dessa página. Assim, para definir os sites em questão, também são usadas expressões regulares. No entanto, ao contrário das expressões usadas nas substituições, estas expressões são muito mais básicas, pelo que apenas fazem uso de 3 operadores:

  • A barra vertical (|), que indica o início e/ou fim do endereço;
  • O asterisco (*), que representa 0 (zero) ou mais caracteres;
  • O hífen (), que indica a negação dum endereço.

A barra vertical tipicamente não será usada, já que normalmente não queremos restringir páginas que estejam sobre o um determinado domínio. Por exemplo, se disséssemos que queríamos que as substituições fossem feitas em sites representados pela expressão “jn.pt/paginainicial/|“, o FoxReplace não faria nenhuma substituição sobre as páginas do site, a não ser sobre a página inicial.

O asterisco já terá um potencial de uso mais elevado, se bem que não costuma ser necessário. Na lista de sites abrangidos,  uma expressão que faz uso do asterisco é a que representa as páginas oficiais dos municípios e autarquias de Portugal: cm-*.pt. Essa expressão aceita todos esses sites oficiais. Por exemplo, no caso do site autárquico de Faro, o endereço é www.cm-faro.pt/. No caso da Câmara Municipal de Ferreira do Alentejo, o o endereço será www.cm-ferreira-alentejo.pt/. Em qualquer um dos casos, o FoxReplace procurará palavras em acordês e tentará substituí-las.

O hífen deverá ser o operador com menos uso. Basicamente, qualquer endereço/expressão que esteja precedida dum hífen não será manipulada pelo extra. Assim, só serão feitas substituições em páginas cujo endereço não esteja representado por nenhuma expressão excluída (precedida dum hífen) e que esteja representada por uma expressão normal.

Não deixe de consultar a tabela dos sites adicionados à lista de substituição até ao momento.

Ajudas e referências

Os seguintes links apontam para sites que ajudam a compreender, criar e testar expressões regulares. Atenção que nem todas as funcionalidades são usadas pelo FoxReplace.

  1. Eduardo Lucas Coelho

    Vocês meus amigos já ganharam direito a um panteão no Mosteiro da Batalha ou no dos Jerónimos, à vossa escolha!! Enquanto os autores das tralhas contra as quais lutamos apenas terão direito à vala comum!

Deixe um comentário