Conhecida também como "regex", é uma técnica para "casar" caracteres, palavras, ou um grupo de palavras, podendo buscar ou substitui-los. Como outras linguagens, Ruby também suporta essa técnica. É aconselhado ter conhecimento sobre expressões regulares, pois o resto o Ruby complementa.
- Primeiro passo. Uma expressão é inicializada com barra "/" e finalizada com outra barra. Usando o operador til "~" juntamente com igual "=" o seu retorno padrão diz que a expressão casou, e também retorna a posição da expressão:
/existe/ =~ /existe algo?/ => 0
- Usando o operador til "~" juntamente com interrogação "!" o seu retorno padrão diz que a expressão não casou (ou seja se existir algo diferente retorna true caso contrário false).
/que tal/ != /existe algo?/ => true
- Usando match (corresponde):
exp = /existe/ puts exp.match("existe algo?") => existe
- Usando um dos símbolos de gama de caracteres [a-z] (onde irá selecionar todos os caracteres de 'a' á 'z'),. Veja que a mesma expressão usada serviu para casar as duas frases:
exp = /[a-z]aca/ frase1 = "era uma vez uma vaca" frase2 = "deitei na maca" puts exp.match(frase1) =>vaca puts exp.match(frase2) =>maca
- Extraindo um valor de uma Tag (note que a expressão coleta todos os elementos entre as tag "> <"):
tag = '<a href="https://google.com">Preciso de ti</a>' p />(.*)</.match(tag) =>Preciso de ti
- Obtendo data e hora. (A função match retorna um grupo, para acessar use o endereço desse vetor usando "[ ]"):
datahora = "aqui tem data 06-05-2013 e hora 20:51:38 " exp = /(..-..-....).*(..:..:..)/ val = exp.match(datahora) p val[1],val[2] => "06-05-2013" => "20:51:38"
- Trocando posição palavras. (Usei a global de substituição gsub para trocar a ordem das palavras):
trocar = "primeiro segundo terceiro".gsub(/(\w+)( )(\w+)/,'\3 \1') puts trocar => segundo primeiro terceiro
- Link muito bom, para editor de expressões regulares com Ruby:
http://rubular.com/
Técnicas com Variáveis
Preparei algumas dicas para quem tem dúvidas em relação ao tratamento de variáveis em alguns casos distintos.
- Definindo tamanho da casa decimal de um numero flutuante. (Defini o numero de casas após a virgula, que seria 2):
num = 1.23244040234 p num.round(2) =>1.23
- Retornando pedaço de uma string. (Busco o carácter da 2 á 5 posição):
palavra = 'pedaco' p palavra.slice(3..5) =>aco
- Substituindo palavras:
palavra = "moto" p palavra.gsub("o","a") =>mata
- Caixa alta:
palavra = "baixo" p palavra.upcase =>BAIXO
- Primeira letra maiúscula:
palavra = "mundo" p palavra.capitalize =>Mundo
- Invertendo:
palavra = "roma" p palavra.reverse =>amor
- Procurando algo (a cada resultado armazena em um vetor, no exemplo seguinte verifiquei a quantidade desse vetor):
palavra = "segundo mundo" p palavra.scan('undo') =>["undo","undo"] p palavra.scan('undo').count =>2