Regex é um saco pra você?

Olá pessoal,

É impressão minha ou Regex é um saco para se trabalhar? Complicado de dar manutenção a primeira vista, etc.

Por exemplo, na app que estou mexendo agora tem um pattern assim: /\d{3}-\d{3}-\d{4}|(\d{3})\s?\d{3}-\d{4}/

Quem dá manutenção nisso de cara? Só o papa.

O que vocês acham de Regex? Alguém acha que deve se criar outro meio pra padrões de busca?

[]'s!

Regex realmente não é simples. É considerada uma linguagem à parte, mas uma das vantagens é que é muito poderosa para quem a domina. Outra vantagem é que regex é regex em muitas linguagens e basta vc aprender uma vez. Claro, a sintaxe muda em cada linguagem e isso é um saco, mas isso é rapidamente resolvido quando já se conhece o conceito.

Será que o papa manja de Regex?

Agora que regex já está aí é melhor deixar. Não acho que há um jeito muito melhor para fazer o papel das regex. Pior que ter de aprender regex seria aprender outra regex. :lol:

Bom, não concordo muito… na minha opinião é muito mais fácil você entender uma expressão regular do que desvendar uma lógica complicada.

O que você considera mais difícil? Escrever umas 30 linhas de código Java ou uma de regex?

De início, parece ser a coisa mais complicada do mundo, concordo, mas uma vez pego a manha, acredite: é uma das ferramentas mais (ta no top 3) poderosas que um desenvolvedor tem em mãos.

Quer uma dica pra treinar? http://www.fileformat.info/tool/regex.htm - Uso este site para testar algunas regex de vez em quando. Uma mão na roda.

“Outro padrão para buscas”? Bobagem. Você cairia no regex de novo. O bicho é quase universal.

Não, acho que deveriam comentar o código. Regex não é o problema aqui.

Muito legal! Foi para o favoritos!

Regex é ao mesmo tempo dificil e poderoso. É dificil pra cacete, cada vez que aprendo uma coisa esqueço tudo sobre ele se não utilizo. :lol: :lol: :lol:

http://aurelio.net/er/livro/

Livro muito bom de regex, me fez aprender muito e dar muita risada, aurelio é um fanfarão que manja muito.

Um livro legal para quem ainda tá iniciando é esse aqui:
http://www.temporeal.com.br/produtos.php?id=172153

EDIT:

[quote=AndreGolTurbo]http://aurelio.net/er/livro/

Livro muito bom de regex, me fez aprender muito e dar muita risada, aurelio é um fanfarão que manja muito.[/quote]
Ops. nem vi que tinha postado antes. :slight_smile:

num é tão dificil assim não, pod demorar a gravar, mas isso é resolvido tendo alguma apostila ao lado, ou se preferir tendo anotações do proprio punho q assim entende melhor, mas se java aceitasse posix, regex seria bem mais fácil, pelo menos eu tentei e num consegui, se alguém ae souber como, posta ae, abraços

Hehe complicado mesmo, nunca entendi direito isso veio, nunca precisei a serio tmb,
Mais alguem ai sabe traduzir essa regex ai???

/\d{3}-\d{3}-\d{4}|\(\d{3}\)\s?\d{3}-\d{4}/

Ela bate com as seguintes 3 strings abaixo:
999-999-9999
(999) 999-9999
(999)999-9999

mas também - e é isso que é barra-pesada - bate com isto aqui (dígitos em ideogramas chineses)

一二三-八六匕四

De fato, se realmente quiser bater com dígitos normais você deveria usar:

/[0-9]{3}-[0-9]{3}-[0-9]{4}|([0-9])\s?[0-9]{3}[0-9]{4}/

[quote=pintofree]Hehe complicado mesmo, nunca entendi direito isso veio, nunca precisei a serio tmb,
Mais alguem ai sabe traduzir essa regex ai???[/quote]

/\d{3}-\d{3}-\d{4}|(\d{3})\s?\d{3}-\d{4}/

3 dígitos, traço, 3 dígitos, traço, 4 dígitos
OU
Abre parênteses, 3 dígitos, fecha parênteses, 0 ou 1 espaços, 3 dígitos, traço, 4 dígitos.

Acho que é isso. :XD:

Edit: It’s impossible to be faster than thingol. :wink:

Normalmente eu faço o seguinte: se for necessário usar uma expressão regular muito complicada, acabo quebrando em várias, mesmo que o processamento seja mais lento.
Por exemplo, é possível escrever uma expressão regular (usando “(?!)” ) que só bata com uma determinada string se ela NÃO apresentar uma determinada substring, mas isso é difícil até de explicar, então eu prefiro quebrar a expressão em dois testes.

Outra coisa interessante é quebrar o padrão em pedaços e pôr comentários para cada pedaço. No nosso caso, teríamos algo como:

String strTelefone = 
    "\d{3}-\d{3}-\d{4}"     // telefone no formato "999-999-9999"
 + "|"  // OU
 + "\(\d{3}\)\s?\d{3}-\d{4}"; // telefone no formato "(999) 999-9999" ou "(999)999-9999"
Pattern patTelefone = Pattern.compile (strTelefone);
1 curtida

Regex é da hora.

[quote=AUser]Quem dá manutenção nisso de cara? Só o papa.
[/quote]

Já experimentou usar testes unitários? :wink:

[quote=s4nchez][quote=AUser]Quem dá manutenção nisso de cara? Só o papa.
[/quote]

Já experimentou usar testes unitários? :wink: [/quote]

Existem alguns casos estranhos que dificilmente são pegos em testes unitários feitos por meros mortais, como oO caso que o thingol deu, de que \d{3} também pega números chineses por exemplo. Dificilmente algum mero mortal pensaria nisso. Desta forma acabaria fazendo testes com coisas como “12”, “123”, “999”, “aaa”, “99a”, “a66”, “1234”, “123a” e coisas assim, e todos os testes teriam o resultado esperado. Mas, a regex ainda estaria incorreta mesmo assim, pois o certo seria [0-9]{3}. Se o cara for um guru de regex e se lembrar desses detalhes esotéricos, ele faria um teste colocando dígitos árabes, chineses ou hebraicos. Mas meros mortais não fazem isso.

Regex é o passatempo favorito dos nerds tetudos e virgens.
Para dormirem ao inves de contarem carneirinhos ficam imaginando regex de cabeça. :lol:

:stuck_out_tongue:

[quote=victorwss]
Existem alguns casos estranhos que dificilmente são pegos em testes unitários feitos por meros mortais, como oO caso que o thingol deu, de que \d{3} também pega números chineses por exemplo. Dificilmente algum mero mortal pensaria nisso. Desta forma acabaria fazendo testes com coisas como “12”, “123”, “999”, “aaa”, “99a”, “a66”, “1234”, “123a” e coisas assim, e todos os testes teriam o resultado esperado. Mas, a regex ainda estaria incorreta mesmo assim, pois o certo seria [0-9]{3}. Se o cara for um guru de regex e se lembrar desses detalhes esotéricos, ele faria um teste colocando dígitos árabes, chineses ou hebraicos. Mas meros mortais não fazem isso.[/quote]

A situação que você descreve vale para qualquer código. Programadores melhores escrevem testes melhores. Isso não diminui o valor dos testes em si.