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:
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.
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:
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.
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
[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.
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);
[quote=s4nchez][quote=AUser]Quem dá manutenção nisso de cara? Só o papa.
[/quote]
Já experimentou usar testes unitários? [/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.
[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.