Expressão regular para acentos

3,981 views
Skip to first unread message

Rafael Crivellari Saliba Schouery

unread,
Jan 24, 2008, 2:06:29 PM1/24/08
to rail...@googlegroups.com
Olá pessoal,
Primeiramente irei me apresentar, já que é a minha primeira mensagem na lista.
Eu me chamo Rafael Schouery, estou no ultimo ano do BCC e tenho um blog: http://vidageek.net

Comecei a mexer um pouco com rails recentemente e estava fazendo um modelo usando
o RSpec. É um modelo simples de usuário. Ele contém um campo fullname que gostaria
de validar com uma regexp.

Agora a questão é: existe um jeito fácil de falar que permito qualquer letra, incluindo as
acentuadas? Se não tivesse acento eu poderia fazer algo do tipo /\A[A-Za-z ]+\Z/
(eu sei que não está completamente redonda a regexp e que um nome começando
por espaço seria aceito, é apenas para ilustrar a questão).
Mas a minha ideia é a de usar esses intervalos para também incluir os acentos,
analisando aonde eles ocorrem na tabela do iso-8859-1.
O problema é que a regexp vai ficar horrivel, e quem sabe até errada por
estar muito complicada.

Deu uma pesquisa e me parece que o Ruby não é muito bom para tratar
essas coisas. Existe um jeito mais fácil?

Até mais!

--
Rafael Schouery
VidaGeek.net

Leandro Camargo

unread,
Jan 27, 2008, 11:39:28 AM1/27/08
to rail...@googlegroups.com
Use o Iconv.
Veja se isso resolve seu caso:
http://www.ruby-forum.com/topic/122471

2008/1/24 Rafael Crivellari Saliba Schouery <scho...@gmail.com>:

Rafael Crivellari Saliba Schouery

unread,
Jan 27, 2008, 12:05:00 PM1/27/08
to rail...@googlegroups.com
Olá Leandro,
sua sugestão é de que eu deveria usar o iconv primeiro para
remover os acentos e então usar a regexp para validar?
Me parece uma boa.
Obrigado, até mais!


2008/1/27 Leandro Camargo <leand...@gmail.com>:
Use o Iconv.
Veja se isso resolve seu caso:
http://www.ruby-forum.com/topic/122471

2008/1/24 Rafael Crivellari Saliba Schouery <scho...@gmail.com>:
> Ol� pessoal,
> Primeiramente irei me apresentar, j� que � a minha primeira mensagem na

> lista.
> Eu me chamo Rafael Schouery, estou no ultimo ano do BCC e tenho um blog:
> http://vidageek.net
>
> Comecei a mexer um pouco com rails recentemente e estava fazendo um modelo
> usando
> o RSpec. � um modelo simples de usu�rio. Ele cont�m um campo fullname que

> gostaria
> de validar com uma regexp.
>
> Agora a quest�o �: existe um jeito f�cil de falar que permito qualquer
> letra, incluindo as
> acentuadas? Se n�o tivesse acento eu poderia fazer algo do tipo /\A[A-Za-z
> ]+\Z/
> (eu sei que n�o est� completamente redonda a regexp e que um nome come�ando
> por espa�o seria aceito, � apenas para ilustrar a quest�o).
> Mas a minha ideia � a de usar esses intervalos para tamb�m incluir os

> acentos,
> analisando aonde eles ocorrem na tabela do iso-8859-1.
> O problema � que a regexp vai ficar horrivel, e quem sabe at� errada por
> estar muito complicada.
>
> Deu uma pesquisa e me parece que o Ruby n�o � muito bom para tratar
> essas coisas. Existe um jeito mais f�cil?
>
> At� mais!
>
> --
> Rafael Schouery
> VidaGeek.net
>  >
>

Leandro Camargo

unread,
Jan 27, 2008, 1:46:33 PM1/27/08
to rail...@googlegroups.com
É, é exatamente essa a idéia. =]
Eu costumo fazer isso em caso de acentos em URLs e afins.

2008/1/27 Rafael Crivellari Saliba Schouery <scho...@gmail.com>:

Rafael Crivellari Saliba Schouery

unread,
Jan 27, 2008, 3:24:11 PM1/27/08
to rail...@googlegroups.com
Valeu,
vou ver no que da.
Obrigado!

2008/1/27 Leandro Camargo <leand...@gmail.com>:

Ramon Soares

unread,
Jan 25, 2008, 6:45:22 PM1/25/08
to rail...@googlegroups.com
dependendo do locale da maquina um /[[:ALPHA:]]+/

a sua regex esta errada "\A" casa com qualquer caractere que n seja
alfabeto.

de que forma exatamente vc quer validar este campo?
se for apenas pra conter conter caracteres alphanumericos. vc pode usar
o seguinte:

/^[A-Za-zÀ-ú0-9.\s]+$/

Rafael Crivellari Saliba Schouery

unread,
Jan 28, 2008, 12:40:23 PM1/28/08
to rail...@googlegroups.com
Ola,
Vi em alguma documentação que \A indica pegar desde o inicio (igual ao ^).
Acho que foi no pickaxe.
Prefiro que o projeto fique independente do locale pois não sei onde será hosperdado ainda.
Vou tentar estar regexp que você mandou. Como é apenas nome completo ela deve ser suficiente.
Até mais!

2008/1/25 Ramon Soares <ramong...@gmail.com>:



--
Rafael Schouery
VidaGeek.net

Ramon Soares

unread,
Jan 28, 2008, 2:17:08 PM1/28/08
to rail...@googlegroups.com
o \A quer dizer [^A-Za-z]. o "^" dentro de uma lista torna esta uma
lista negada.

Rafael Crivellari Saliba Schouery wrote:
> Ola,
> Vi em alguma documentação que \A indica pegar desde o inicio (igual ao ^).
> Acho que foi no pickaxe.
> Prefiro que o projeto fique independente do locale pois não sei onde
> será hosperdado ainda.
> Vou tentar estar regexp que você mandou. Como é apenas nome completo
> ela deve ser suficiente.
> Até mais!
>
> 2008/1/25 Ramon Soares <ramong...@gmail.com

> <mailto:ramong...@gmail.com>>:

Rafael Crivellari Saliba Schouery

unread,
Jan 28, 2008, 2:42:52 PM1/28/08
to rail...@googlegroups.com
Isso não seria o \W?

"The sequence \A matches the beginning of a string, and \z and \Z match the end of a string.
(Actually, \Z matches the end of a string unless the string ends with a \n, it which case it matches
just before the \n.)"
Programming Ruby 2 Ed, pg 70

Acho que me enganei em relação ao ^, confundi com o simbolo usado em Perl para indicar começo
de string.


2008/1/28 Ramon Soares <ramong...@gmail.com>:

Ramon Soares

unread,
Jan 28, 2008, 2:55:23 PM1/28/08
to rail...@googlegroups.com
"\W" é uma lista negada de caracteres alfanuméricos e "\A" uma lista
negada de caracteres do alfabeto.

Barra-Letra | Equivalente
\w | [[:alnum:]_] (palavra)
\W | [^[:alnum:]_] (não-palavra)
\d | [[:digit:]] (dígito)
\D | [^[:digit:]] (não-dígito)
\a | [[:alpha:]] (alfabeto)
\A | [^[:alpha:]] (não-alfabeto)
....

existe um boa quantidade de barra-letras.

Rafael Crivellari Saliba Schouery wrote:
> Isso não seria o \W?
>
> "The sequence \A matches the beginning of a string, and \z and \Z
> match the end of a string.
> (Actually, \Z matches the end of a string unless the string ends with
> a \n, it which case it matches
> just before the \n.)"
> Programming Ruby 2 Ed, pg 70
>
> Acho que me enganei em relação ao ^, confundi com o simbolo usado em
> Perl para indicar começo
> de string.
>
>
> 2008/1/28 Ramon Soares <ramong...@gmail.com

> <mailto:ramong...@gmail.com>>:


>
>
> o \A quer dizer [^A-Za-z]. o "^" dentro de uma lista torna esta uma
> lista negada.
>
> Rafael Crivellari Saliba Schouery wrote:
> > Ola,
> > Vi em alguma documentação que \A indica pegar desde o inicio
> (igual ao ^).
> > Acho que foi no pickaxe.
> > Prefiro que o projeto fique independente do locale pois não sei onde
> > será hosperdado ainda.
> > Vou tentar estar regexp que você mandou. Como é apenas nome completo
> > ela deve ser suficiente.
> > Até mais!
> >
> > 2008/1/25 Ramon Soares <ramong...@gmail.com
> <mailto:ramong...@gmail.com>

> > <mailto:ramong...@gmail.com <mailto:ramong...@gmail.com>>>:

Ramon Soares

unread,
Jan 28, 2008, 3:00:47 PM1/28/08
to rail...@googlegroups.com
quando ao "^" ele realmente significa começo da string salvo alguns
casos, como quando estar dentro de uma lista.

da uma olhada no site http://aurelio.net/er tem bastante conteúdo. e
recomendo o livro do aurelio caso queira aprender + sobre regex.

Rafael Crivellari Saliba Schouery wrote:
> Isso não seria o \W?
>
> "The sequence \A matches the beginning of a string, and \z and \Z
> match the end of a string.
> (Actually, \Z matches the end of a string unless the string ends with
> a \n, it which case it matches
> just before the \n.)"
> Programming Ruby 2 Ed, pg 70
>
> Acho que me enganei em relação ao ^, confundi com o simbolo usado em
> Perl para indicar começo
> de string.
>
>
> 2008/1/28 Ramon Soares <ramong...@gmail.com

> <mailto:ramong...@gmail.com>>:


>
>
> o \A quer dizer [^A-Za-z]. o "^" dentro de uma lista torna esta uma
> lista negada.
>
> Rafael Crivellari Saliba Schouery wrote:
> > Ola,
> > Vi em alguma documentação que \A indica pegar desde o inicio
> (igual ao ^).
> > Acho que foi no pickaxe.
> > Prefiro que o projeto fique independente do locale pois não sei onde
> > será hosperdado ainda.
> > Vou tentar estar regexp que você mandou. Como é apenas nome completo
> > ela deve ser suficiente.
> > Até mais!
> >
> > 2008/1/25 Ramon Soares <ramong...@gmail.com
> <mailto:ramong...@gmail.com>

> > <mailto:ramong...@gmail.com <mailto:ramong...@gmail.com>>>:

Rafael Crivellari Saliba Schouery

unread,
Jan 29, 2008, 5:28:16 AM1/29/08
to rail...@googlegroups.com
Desculpa a insistência,
mas qual a sua fonte em relação a isso?
No irb:
irb(main):007:0> puts ("rafael".match /fa/)
fa
=> nil
irb(main):008:0> puts ("rafael".match /\Afa/)
nil
=> nil
irb(main):009:0> puts ("rafael".match /\Ara/)
ra
=> nil

Ou seja, o primeiro encontra fa como pertencente a rafael,
o segundo não mas o terceiro encontra ra mesmo se ter
um caracter não alfanumerico no começo.
Meu problema não é entender expressões
regulares, já que já fiz o curso de Linguagens Formais e
Automatos. Meu único problema é com os acentos e agora
a questão de se \A é ou não indicador de começo de string,
o qual já mostrei citando o próprio pickaxe.
Desculpa ser chato no assunto, mas acho que é interessante
que a versão correta seja dita para qualquer pessoa que venha ler
esta série de e-mails.

Até mais!

2008/1/28 Ramon Soares <ramong...@gmail.com>:

Ramon Soares

unread,
Jan 29, 2008, 6:24:57 AM1/29/08
to rail...@googlegroups.com
Rafael realmente.

dei uma pesquisada no man do pcre.

estava tirando como base o livro sobre er do aurelio e nele tinha as
informações que passei.

Rafael Crivellari Saliba Schouery wrote:
> Desculpa a insistência,
> mas qual a sua fonte em relação a isso?
> No irb:
> irb(main):007:0> puts ("rafael".match /fa/)
> fa
> => nil
> irb(main):008:0> puts ("rafael".match /\Afa/)
> nil
> => nil
> irb(main):009:0> puts ("rafael".match /\Ara/)
> ra

> => nil*
> *


> Ou seja, o primeiro encontra fa como pertencente a rafael,
> o segundo não mas o terceiro encontra ra mesmo se ter
> um caracter não alfanumerico no começo.
> Meu problema não é entender expressões
> regulares, já que já fiz o curso de Linguagens Formais e
> Automatos. Meu único problema é com os acentos e agora
> a questão de se \A é ou não indicador de começo de string,
> o qual já mostrei citando o próprio pickaxe.
> Desculpa ser chato no assunto, mas acho que é interessante
> que a versão correta seja dita para qualquer pessoa que venha ler
> esta série de e-mails.
>
> Até mais!
>
> 2008/1/28 Ramon Soares <ramong...@gmail.com

> <mailto:ramong...@gmail.com>>:


>
>
> quando ao "^" ele realmente significa começo da string salvo alguns
> casos, como quando estar dentro de uma lista.
>
> da uma olhada no site http://aurelio.net/er tem bastante conteúdo. e
> recomendo o livro do aurelio caso queira aprender + sobre regex.
>
> Rafael Crivellari Saliba Schouery wrote:
> > Isso não seria o \W?
> >
> > "The sequence \A matches the beginning of a string, and \z and \Z
> > match the end of a string.
> > (Actually, \Z matches the end of a string unless the string ends
> with
> > a \n, it which case it matches
> > just before the \n.)"
> > Programming Ruby 2 Ed, pg 70
> >
> > Acho que me enganei em relação ao ^, confundi com o simbolo usado em
> > Perl para indicar começo
> > de string.
> >
> >
> > 2008/1/28 Ramon Soares <ramong...@gmail.com
> <mailto:ramong...@gmail.com>

> > <mailto:ramong...@gmail.com <mailto:ramong...@gmail.com>>>:

Shairon Toledo

unread,
Jan 29, 2008, 7:04:35 AM1/29/08
to rail...@googlegroups.com
Dê um olhada aqui http://www.hashcode.eti.br/?p=33

Em 29/01/08, Ramon Soares <ramong...@gmail.com> escreveu:



--
[ ]'s
Shairon Toledo
http://www.hashcode.eti.br

Rafael Crivellari Saliba Schouery

unread,
Feb 1, 2008, 1:48:47 PM2/1/08
to rail...@googlegroups.com
Olá,
para quem estava acompanhando acabei fazendo:

if !fullname.nil?
#removendo acentos com o tr
clean_fullname = fullname.tr 'À-ÖÙ-Üà-öù-ü', ''
if !clean_fullname.match(/\A[A-Za-z \.']+\Z/)
errors.add(:fullname,"Invalid Fullname")
end
end

Tenho que melhorar a regexp ainda, mas já removi os acentos com o tr,
antes de testar.
Tentei usar o Iconv mas não consegui. Achei o ri dele muito incompleto.
Até mais e obrigado pela ajuda!

Rafael Schouery
http://vidageek.net

Reply all
Reply to author
Forward
0 new messages