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 NunesEnquanto 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
- 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.
- Wildcards: possibilita a utilização
de caracteres curingas, como por exmplo #, *, ?, 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.