Há algum tempo venho me aventurando no ASP.NET e, por consequência, no Visual Studio. Muito bacana, diga-se de passagem. A facilidade de desenvolvimento é um ponto muito interessante do framework, bem como da IDE.

Mas eis que me deparo como uma situação: tenho que substituir um trecho de código por outro em vários arquivos. Para quem conhece expressões regulares, logo vê que isso pode ser feito com um mínimo de esforço, criando-se uma expressão regular simples, aí você abre um “find & replace” e voilà! Mas o danado do Visual Studio cismou de não me obedecer. – Ai, ai, ai menino feio! =P

Deixa eu falar um pouco de expressões regulares para você entender o meu drama:

Quando eu preciso localizar um texto que “casa” com um padrão e substituir parte do texto por outro, eu posso fazer de duas formas: “na unha” ou usar expressões regulares. Eu sou meio preguiçoso nesse sentido, então prefiro ER (provando que sou preguiçoso, vou usar ER daqui para frente).

Por exemplo, eu tenho as seguintes ocorrêcias, por mera ilustração:

enviaEmail(“Fulano”, instancia1.EmailSistema), enviaEmail(“Fulano”, instancia2.EmailSistema), enviaEmail(“Fulano”, instancia3.EmailSistema), etc. Quero alterar toda a parte “instanciaX.EmailSistema” por outra coisa qualquer. Então criemos a seguinte ER:

procurar por: enviaEmail\((“Fulano”), (instancia.\.EmailSistema)\)
substituir por: enviaEmail(\1, “fulano@site.com”)

O parentese é usado para agrupar coisas, então o que pretendo fazer é substituir o segundo grupo “(instancia.\.EmailSistema)” por “fulano@site.com”, mas manter o primeiro grupo, para isso eu uso o retrovisor \1.

Mas isso não funciona no Visual Studio. Afff!

Recorrendo à mãe do Visual Studio, eis que encontro toda uma documentação sobre expressões regulares. Se você observar, pela documentação, o agrupamento é feito usando parenteses mesmo.

Mas repare também que existe uma observação:

NoteNote
There are syntax differences between the regular expressions that can be used in Find what strings and those that are valid in .NET Framework programming. For example, in Find and Replace, the braces notation {} is used for tagged expressions. So the expression zo{1} matches all occurrences of zo followed by the tag 1, as in Alonzo1 and Gonzo1. But within the .NET Framework, the notation {} is used for quantifiers. So the expression zo{1} matches all occurrences of z followed by exactly one o, as in zone but not in zoo.

Aí eu descobri que para procurar pelo “Find & Replace” do Visual Studio, o agrupamento, que é tratado pela MS como sendo tags, é feito usando chaves “{}” e não parenteses.

Moral da história: a Microsoft sempre tem que inventar de ser diferente. =/