Desenvolvimento - C#

Utilizando expressões regulares no Quick Replace do Visual Studio 2005

Enquanto desenvolvemos, é natural a necessidade de encontrar ou até mesmo substituir porções de códigos. Para tal ação, o Microsoft Visual Studio 2005 possui a ferramenta Find and Replace que na grande maioria das vezes é subutilizada pelos desenvolvedores. Este artigo explora um pouco destes recursos e demonstra o que pode ser feito com os mesmos.

por Ricardo Bortolatto Nunes



Enquanto desenvolvemos, é natural a necessidade de encontrar ou até mesmo substituir porções de códigos. Para tal ação, o Microsoft Visual Studio 2005 possui a ferramenta Find and Replace que na grande maioria das vezes é subutilizada pelos desenvolvedores.

A ferramenta possui algumas opções de pesquisa que podem ser muito funcional, como mostra a figura abaixo.

Figura 1 – Ferramenta de busca e substituição do Microsoft Visual Studio 2005

Agora irei explicar cada opção desta ferramenta:

    Match Case: Esta opção habilita o case sensitive para a pesquisa, ou seja, passa a diferenciar letras maiúsculas de letras minúsculas.
  • Match whole word: Esta opção pesquisa por palavras inteiras, e não mais apenas porções de palavras.
  • Seach up: Esta opção força a procura no texto no sentido de baixo para cima, sendo que por default é ao contrário. Lembrando que ao fim do documento a pesquisa recomeça de cima para baixo a partir do inicio do documento.
  • Seach hidden text: Esta opção permite a procura em texto oculto, ou seja, quando o texto esta collapsed (com um sinal de “+” no inicio da linha) ele é considerado oculto (hidden). A Figura 2 apresenta o metodo construtor oculto e logo em seguida a Figura 3 apresenta o mesmo método não oculto.

Figura 2 - Método construtor oculto.

Figura 3 - Método construtor não oculto

    Use: quando se habilita esta opção é possível utilizar duas sub-opções. São elas
      Wildcards: possibilita a utilização de caracteres curingas, como por exmplo #, *, ?, entre outros.
    • Regular Expressions: possibilita a utilização de expressões regulares, com esta opção é possível ser muito mais preciso em uma procura. Como por exmeplo, especificar palavras que começam com um determinado conjunto de caracteres, ou caracteres no final de linha, entre outros.

Para estas duas sub-opções vou dar uma atenção especial, mesmo porque elas merecem. Lembrando que para ambas as opções, é habilitado um botão ao lado do campo de pesquisa para auxiliar com os caracteres mais comuns na construção do texto a ser pesquisado, inclusive há um link para uma lista completa de caracteres. Como é apresentado na Figura 4.

Figura 4 – Botão de Auxilio à construção de expressão de pesquisa

Primeiramente falando de caracteres curingas, vou mostras alguns exemplos que podem ser de muita utilidade. Imagine os cenários:

Você possui N funções classes em seu código e deseja encontrá-las para uma manutenção. De forma apenas para ilustrar os cenários, as classes possuem as seguintes declarações:

Public Class cliente1

Public Class cliente2

Public Class cliente3

Public Class clienteA

Public Class clienteB

Public Class fornecedor1

Public Class fornecedor2

Imagine a necessidade de encontrar todas as classes de clientes: basta utilizar no campo de procura da ferramenta expressão: Class cliente*, como é mostrado na figura 5.

Figura 5 – Exemplo de expressão de pesquisa.

Agora imagine a necessidade de procurar apenas as classes de clientes que terminem com um caractere numérico. A expressão para esta pesquisa é: class cliente#.

É possível também agrupar caracteres curingas na mesma pesquisa como por exemplo, caso eu não saiba a primeira letra do que eu quero procurar eu utilizo o caractere ‘?’, quando eu procuro um caractere numérico eu utilizo # e ainda posso utilizar operador de negação como, por exemplo [!#], esta operação irá me retornar um caractere não numérico. Segue um exemplo de busca com agrupamento de caracteres curingas:

?ublic * cliente[!#] Esta expressão irá retornar todos os grupos de palavras que comecem com qualquer caractere seguido de ‘ublic’ seguidos de mais qualquer sequencia de caractere que contenha a palavra cliente e após esta um caracter não numérico.

Então vou falar de expressões regulares, que é semelhante à utilização de wildcards, mas as expressões são muito mais poderosas.

Expressões regulares é um assunto bastante extenso que vira livro, ou vários como já existe por aí, mas de uma forma bem simplória é um método para especificar um padrão de texto. Já é muito utilizada na computação desde seus primórdios devido a facilidade de se fazer comparações em um texto.

Abaixo são apresentados alguns operadores de expressões regulares.

. (ponto) representa um único caractere

+ um ou mais caracteres

* nenhum ou mais caracteres

[] conjunto de caracteres

< Inicio de palavra

> Fim de palavra

^ Inicio de linha

:z Inteiro

:w Caractere alfabético

E por ai vai uma enorme lista, que pode ser encontrada em: http://msdn2.microsoft.com/pt-br/library/aa293063(en-us,VS.71).aspx.

Então vamos aos exemplos.

Para encontrar todas as palavras que comecem com “Cla”, utilizamos a seguinte expressão:

<Cla

Para encontrar os nomes das classes de clientes que possuam um numero terminando o nome da classe:

cliente:z>

Para encontrar os nomes das classes de clientes que possuam o inicio do nome como cliente seguido de uma letra que pode ser apenas A, B ou C

<cliente[ABC]

E tais combinações vão surgindo de acordo com a necessidade.

Como este artigo tem foco na ferramenta Quick and Replace do Microsoft Visual Studio 2005, é interessante complementar que um ótimo recurso é subdividir as consultas em expressões regulares em subconjuntos para efetuar a substituição da busca desejada, lembrando que no campo replace não se utiliza expressões regulares e sim apenas texto puro. Uma parcela do texto selecionado pode ser substituída aplicando-se no campo replace uma “\” seguida da posição do subconjunto, para a criação do subconjunto se utiliza {}.

Segue abaixo os exemplos:

Imagine que se deseja substituir todos os nomes de classes das classes

Public Class cliente1

Public Class cliente2

Public Class cliente3

Public Class clienteA

Public Class clienteB

para:

Public Class Customer1

Public Class Customer2

Public Class Customer3

Public Class CustomerA

Public Class CustomerB

Perceba que o último caractere não se altera, então vamos à expressão:

No campo find:

cliente{.}

No campo Replace:

customer\1

Outro exemplo um pouco maior, substituir o nome de um pedaço de vários datasets em várias partes. Substituir:

datasetClientes1.Tables("TB_CLI").Rows.Count()

datasetClientes2.Tables("TB_CLI").Rows.Count()

datasetClientes3.Tables("TB_CLI").Rows.Count()

por:

datasetCustomers1.Tables("TB_DEP").Rows.Count()

datasetCustomers2.Tables("TB_DEP").Rows.Count()

datasetCustomers3.Tables("TB_DEP").Rows.Count()

Para tal, separei minha consulta em subconjuntos de tal forma que a palavra:

  • dataset é o primeiro subconjunto(\1)
  • clientes precisa existir na string após a palavra dataset
  • a sequencia precisa ser, necessariamente um inteiro seguido de um caractere qualquer(.) e a palavra tables seguida de mais um caractere qualquer, este é o subconjunto 2 (\2).
  • O próximo subconjunto(\3) é a tabela referenciada TB_CLI
  • E por fim o restante da linha no subconjunto 4 (\4)

{dataset}Clientes{:z.Tables.}{"TB_CLI"}{..Rows.Count..}

Para o campo replace temos:

O primeiro subconjunto seguido da parte que substitui o nome clientes, em seguida o subconjunto 2 com o novo nome da tabela e o subconjunto 4.

\1Customers\2"TB_DEP"\4

Espero ter contribuído com o grupo. Passando um pouco do meu conhecimento. Bom trabalho a todos.

Ricardo Bortolatto Nunes

Ricardo Bortolatto Nunes - Mestrando em ciência da computação pela Universidade Federal de Uberlândia, possui uma certificação Microsoft MCP e trabalha atualmente em desenvolvimento de aplicações .NET.