English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expressões Regulares Ruby

Expressão regularÉ uma sequência especial de caracteres, que usa um padrão com uma sintaxe específica para coincidir ou encontrar conjuntos de strings.

A expressão regular é composta por alguns caracteres específicos previamente definidos e suas combinações, formando uma "string de regra", que é usada para expressar uma lógica de filtragem de strings.

Sintaxe

Expressão regularA expressão regular, vista literalmente, é um padrão entre barras invertidas ou entre qualquer delimitador após %r, conforme mostrado a seguir:

 /padrão/
/padrão/im    # Pode especificar opções
%r!/usr/local! # Expressão regular com delimitador

Exemplo Online

#!/usr/bin/ruby
 
line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";
 
if ( line1 =~ /Cats(.*)/ )
  puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
  puts "Line2 contains  Dogs"
end

O resultado de execução do exemplo acima é:

Line1 contains Cats

Modificadores da expressão regular

A expressão regular pode conter um modificador opcional, que controla vários aspectos do match. O modificador é especificado após o segundo caractere de barra invertida, como mostrado no exemplo acima. A tabela a seguir lista os modificadores possíveis:

Modificadoresdescrição
iIgnorar a capitalização ao coincidir com o texto.
oExecutar a interpolação #{} apenas uma vez, a expressão regular é avaliada logo no início.
xIgnorar espaços em branco, permitindo que símbolos de espaço e comentários sejam inseridos em toda a expressão.
mCorresponde a linhas múltiplas, considerando o caractere de nova linha como caractere normal.
u,e,s,nInterpreta a expressão regular como Unicode (UTF-8)、EUC、SJIS ou ASCII. Se não for especificado o modificador, considera-se que a expressão regular usa a codificação de origem.

Da mesma forma que as strings são delimitadas por %Q, o Ruby permite que você use %r como o início de um padrão de expressão regular, seguido por qualquer delimitador. Isso é muito útil ao descrever grandes quantidades de barras invertidas que você não deseja escapar.

# Abaixo, o caractere barra invertida é correspondido sem escapamento
%r|/|               
 
# Caracteres de flag podem ser correspondidos pela seguinte sintaxe
%r[</(.*)>]i

Padrão de expressão regular

Além dos caracteres de controle,(+ ? . * ^ $ ( ) [ ] { } | \),outros caracteres todos correspondem a si mesmos. Você pode escapar caracteres de controle colocando um backslash antes deles.

A tabela a seguir lista a sintaxe de expressões regulares disponíveis no Ruby.

Padrãodescrição
^Corresponde ao início da linha.
$Corresponde ao final da linha.
.Corresponde a qualquer caractere simples, exceto o caractere de nova linha. Quando a opção m estiver ativa, também pode correspondente o caractere de nova linha.
[...]Corresponde a qualquer caractere simples que esteja entre colchetes.
[^...]Corresponde a qualquer caractere simples que não esteja entre colchetes.
re*Corresponde ao subpadrão anterior zero ou mais vezes.
re+Corresponde ao subpadrão anterior uma ou mais vezes.
re?Corresponde ao subpadrão anterior zero ou uma vez.
re{ n}Corresponde ao subpadrão anterior n vezes.
re{ n,}Corresponde ao subpadrão anterior n vezes ou mais.
re{ n, m}Corresponde ao subpadrão anterior pelo menos n vezes até m vezes.
a| bCorresponde a a ou b.
(re)Agrupa a expressão regular e lembra o texto correspondente.
(?imx)Temporariamente ativa as opções i, m ou x dentro da expressão regular. Se dentro de parênteses, afeta apenas a parte dentro dos parênteses.
(?-imx)Temporariamente desativa as opções i, m ou x dentro da expressão regular. Se dentro de parênteses, afeta apenas a parte dentro dos parênteses.
(?: re)Agrupa a expressão regular, mas não lembra o texto correspondente.
(?imx: re)Temporariamente ativa as opções i, m ou x dentro dos parênteses.
(?-imx: re)Temporariamente desativa as opções i, m ou x dentro dos parênteses.
(#...)Comentário.
(?= re)Usa o padrão para especificar uma posição. Não há intervalo.
(?! re)Usa a negação do padrão para especificar uma posição. Não há intervalo.
(?> re)Corresponde a um padrão independente sem retrocesso.
\wCorresponde a caracteres alfabéticos.
\WCorresponde a caracteres não-alfabéticos.
\sCoincidência de caractere branco. Equivalente a [\t\n\r\f]。
\SCoincidência de caractere não-branco.
\dCoincidência de numérico. Equivalente a [0-9]。
\DCoincidência de não-numérico.
\ACoincidência com o início da string.
\ZCoincidência com o final da string. Se houver caractere de nova linha, coincide apenas com o caractere de nova linha antes.
\zCoincidência com o final da string.
\GCoincidência com o ponto final da última coincidência completada.
\bCoincidência com o limite de palavra quando fora de parênteses, com o caractere de backspace (0x08)。
\BCoincidência de não-limite de palavra.
\n, \t, etc.Coincidência de caractere de nova linha, caractere de retorno, tabulação, etc.
\1...\9Coincidência com a subexpressão de grupo n-ésima.
\10Se já coincidir, coincide com a subexpressão de grupo n-ésima. Caso contrário, aponta para a representação octal do código de caractere.

Exemplo de expressão regular

caractere

exemplodescrição
/ruby/Coincidência de "ruby"
¥Coincidência do símbolo de Yen. Ruby 1.9 e Ruby 1.8 Suporta múltiplos caracteres.

Classe de caractere

exemplodescrição
/[Rr]uby/Coincidência de "Ruby" ou "ruby"
/rub[ye]/combina "ruby" ou "rube"
/[aeiou]/Coincidência de qualquer vogal minúscula
/[0-9]/Coincidência de qualquer número, equivalente a /[0123456789]/ Idêntico
/[a-z]/Coincidência de qualquer caractere minúsculo ASCII
/[A-Z]/Coincidência de qualquer caractere maiúsculo ASCII
/[a-zA-Z0-9]/Coincidência de qualquer caractere dentro de parênteses
/[^aeiou]/Coincidência de qualquer caractere não-vogal minúsculo
/[^0-9]/Coincidência de qualquer caractere não-numérico

Classe de caractere especial

exemplodescrição
/./Coincidência de qualquer caractere exceto o caractere de nova linha
/./mTambém coincide com o caractere de nova linha, no modo de várias linhas
/\d/Coincidência de um caractere numérico, equivalente a /[0-9]/
/\D/Coincidência de um caractere não-numérico, equivalente a /[^0-9]/
/\s/Coincidência de um caractere branco, equivalente a /[ \t\r\n\f]/
/\S/Coincidência de um caractere não-branco, equivalente a /[^ \t\r\n\f]/
/\w/Coincidência de um caractere alfabético, equivalente a /[A-Za-z0-9_]/
/\W/Coincidência de um caractere não-alfabético, equivalente a /[^A-Za-z0-9_]/

Repetição

exemplodescrição
/ruby?/Coincidência de "rub" ou "ruby". O y é opcional.
/ruby*/Coincidência de "rub" seguido por 0 ou mais do y.
/ruby+/Coincidência de "rub" seguido por 1 um ou mais do y.
/\d{3}/Coincidência exata 3 um número.
/\d{3,}/coincidência 3 um ou mais números.
/\d{3,5}/coincidência 3 um,4 ou 5 um número.

Repetição não-gulosa

Isso coincidirá com a repetição mínima.

exemplodescrição
/<.*>/Repetição gulosa: coincidência de "<ruby>perl>"
/<.*?>/Repetição não-gulosa: coincidência de "<ruby>perl>" com "<ruby>"

Agrupamento por parênteses

exemplodescrição
/\D\d+/sem grupos: + repetição de \d
/(\D\d)+/grupos: + repetição de \D\d
/([Rr]uby(, )?)+/combina "Ruby", "Ruby, ruby, ruby", etc.

referências inversas

isto novamente combina o grupo que foi combinado anteriormente.

exemplodescrição
/([Rr])uby&\1ails/combina ruby&rails ou Ruby&Rails
/(['"])(?:(?!\1).)*\1/cadeia de caracteres entre aspas simples ou duplas. \1 combina o caractere que o primeiro grupo combina, \2 combina o caractere que a segunda grupo combina, e assim por diante.

substituição

exemplodescrição
/ruby|rube/combina "ruby" ou "rube"
/rub(y|le)/combina "ruby" ou "ruble"
/ruby(!+|\?)/"ruby" seguido de um ou mais ! ou seguido de um ?

âncora

isto requer especificar o local de combinação.

exemplodescrição
/^Ruby/combina a string que começa com "Ruby" ou a linha
/Ruby$/combina a string que termina com "Ruby" ou a linha
/\ARuby/combina a string que começa com "Ruby"
/Ruby\Z/combina a string que termina com "Ruby"
/\bRuby\b/combina a fronteira de palavra "Ruby"
/\brub\B/\B é uma fronteira não-palavra: combina "rube" e "ruby" com "rub", mas não combina "rub" sozinho
/Ruby(?=!)/se houver um exclamation mark após "Ruby", combina "Ruby"
/Ruby(?!!)/se não houver um exclamation mark após "Ruby", combina "Ruby"

sintaxe especial de parênteses

exemplodescrição
/R(?#comment)/combina "R". Todos os caracteres restantes são comentários.
/R(?i)uby/ao combinar "uby", não distingue maiúsculas e minúsculas.
/R(?i:uby)/é o mesmo que acima.
/rub(?:y|le))/só agrupamento, sem \1 referências inversas

busca e substituição

sub e gsub e suas variáveis de substituição sub! e gsub! é um método importante de string ao usar expressão regular.

todas essas métodos são usados para executar operações de busca e substituição usando padrões de expressão regular.sub e sub! substitui a primeira ocorrência do padrão,gsub e gsub! substitui todas as ocorrências do padrão.

sub e gsub retorna uma nova string, mantendo a string original inalterada, enquanto sub! e gsub! então modificará as strings que eles chamam.

Exemplo Online

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
phone = "138-3453-1111 # Esta é um número de telefone"
 
# Remover comentários Ruby
phone = phone.sub!(/#.*$/, ")   
puts "Número de Telefone : #{phone}"
 
# Remover todos os caracteres exceto os números
phone = phone.gsub!("/\D/, ")    
puts "Número de Telefone : #{phone}"

O resultado de execução do exemplo acima é:

Número de Telefone : 138-3453-1111 
Número de Telefone : 13834531111

Exemplo Online

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
text = "rails é rails, Ruby on Rails é uma excelente framework Ruby"
 
# Transformar todos os "rails" em "Rails"
text.gsub!("rails", "Rails")
 
# Transformar todos os "Rails" em maiúscula
text.gsub!("/\brails\b/, "Rails")
 
puts "#{text}"

O resultado de execução do exemplo acima é:

Rails é uma excelente framework Ruby para Ruby on Rails