quarta-feira, maio 19, 2010

Apanhando das expressões regulares no Ruby

Estava eu brincando com o Ruby 1.9 e tentando fazer uma expressão regular bem simples:
#encoding: utf-8
puts "isso é inaceitável".scan(/\w+/)
resultado:
isso
inaceit
vel
Uh-oh... =/ nada bom.

Procurei por todo lado, tentando achar o que eu estava fazendo de errado. Achei vários posts dizendo que isso deveria funcionar e ninguém com o mesmo problema que eu. Não sei o que fiz de errado até agora, se alguém souber, por favor me avise =/

De qualquer maneira, tentei resolver o problema sem sucesso. Então, na documentação do Oniguruma, achei um "paliativo":
#encoding: utf-8
puts "isso é aceitável".scan(/\p{Word}+/)

E o resultado:
isso
é
aceitável

Ótimo!

Além disso, fuçando lá vi várias outras classes bastante úteis, como "\p{Alpha}", "\p{Alnum}, "\p{Upper}" e "\p{Lower}" entre outros. É possível também negar a classe usando um "\P" (maiúsculo) como prefixo.

Um comentário:

  1. Uai, aqui também não deu problema não, e no irb nem precisei de declarar o encoding:

    irb(main):001:0> "isso é inaceitável".scan(/\w+/)
    => ["isso", "é", "inaceitável"]

    enc.rb
    ------
    # encoding: utf-8
    rst = "isso é inaceitável".scan(/\w+/)
    rst.each {|e| puts e}

    [taq@neo/tmp]ruby1.9 enc.rb
    isso
    é
    inaceitável

    Que que você tá usando aí de OS, homem de Deus? :-)

    ResponderExcluir