Ruby - Expressões regulares
Uma expressão regular é uma sequência especial de caracteres que o ajuda a encontrar ou encontrar outras strings ou conjuntos de strings usando uma sintaxe especializada mantida em um padrão.
Um literal de expressão regular é um padrão entre barras ou entre delimitadores arbitrários seguidos por% r como segue -
Sintaxe
/pattern/
/pattern/im # option can be specified
%r!/usr/local! # general delimited regular expression
Exemplo
#!/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
Isso produzirá o seguinte resultado -
Line1 contains Cats
Modificadores de expressão regular
Literais de expressão regular podem incluir um modificador opcional para controlar vários aspectos de correspondência. O modificador é especificado após o segundo caractere de barra, conforme mostrado anteriormente e pode ser representado por um desses caracteres -
Sr. Não. | Modificador e descrição |
---|---|
1 | i Ignora maiúsculas e minúsculas ao corresponder o texto. |
2 | o Executa # {} interpolações apenas uma vez, na primeira vez que o literal regexp é avaliado. |
3 | x Ignora espaços em branco e permite comentários em expressões regulares. |
4 | m Corresponde a várias linhas, reconhecendo novas linhas como caracteres normais. |
5 | u,e,s,n Interpreta o regexp como Unicode (UTF-8), EUC, SJIS ou ASCII. Se nenhum desses modificadores for especificado, presume-se que a expressão regular use a codificação de origem. |
Como strings literais delimitadas por% Q, Ruby permite que você comece suas expressões regulares com% r seguido por um delimitador de sua escolha. Isso é útil quando o padrão que você está descrevendo contém muitos caracteres de barra que você não deseja escapar -
# Following matches a single slash character, no escape required
%r|/|
# Flag characters are allowed with this syntax, too
%r[</(.*)>]i
Padrões de Expressão Regular
Exceto para personagens de controle, (+ ? . * ^ $ ( ) [ ] { } | \), todos os personagens se combinam. Você pode escapar de um caractere de controle precedendo-o com uma barra invertida.
Sr. Não. | Padrão e Descrição |
---|---|
1 | ^ Corresponde ao início da linha. |
2 | $ Corresponde ao fim da linha. |
3 | . Corresponde a qualquer caractere único, exceto nova linha. Usar a opção m permite que ele corresponda a nova linha também. |
4 | [...] Corresponde a qualquer caractere único entre colchetes. |
5 | [^...] Corresponde a qualquer caractere único que não esteja entre colchetes |
6 | re* Corresponde a 0 ou mais ocorrências da expressão anterior. |
7 | re+ Corresponde a 1 ou mais ocorrências da expressão anterior. |
8 | re? Corresponde a 0 ou 1 ocorrência da expressão anterior. |
9 | re{ n} Corresponde exatamente ao número n de ocorrências da expressão anterior. |
10 | re{ n,} Corresponde a n ou mais ocorrências da expressão anterior. |
11 | re{ n, m} Corresponde a pelo menos n e no máximo m ocorrências da expressão anterior. |
12 | a| b Corresponde a a ou b. |
13 | (re) Agrupa expressões regulares e lembra o texto correspondente. |
14 | (?imx) Alterna temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada. |
15 | (?-imx) Desativa temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada. |
16 | (?: re) Agrupa expressões regulares sem lembrar o texto correspondente. |
17 | (?imx: re) Alterna temporariamente as opções i, m ou x entre parênteses. |
18 | (?-imx: re) Desativa temporariamente as opções i, m ou x entre parênteses. |
19 | (?#...) Comente. |
20 | (?= re) Especifica a posição usando um padrão. Não tem alcance. |
21 | (?! re) Especifica a posição usando negação de padrão. Não tem alcance. |
22 | (?> re) Corresponde ao padrão independente sem retrocesso. |
23 | \w Corresponde a caracteres de palavras. |
24 | \W Corresponde a caracteres que não sejam palavras. |
25 | \s Corresponde ao espaço em branco. Equivalente a [\ t \ n \ r \ f]. |
26 | \S Corresponde a espaços não brancos. |
27 | \d Corresponde aos dígitos. Equivalente a [0-9]. |
28 | \D Corresponde a nondigits. |
29 | \A Corresponde ao início da string. |
30 | \Z Corresponde ao final da string. Se houver uma nova linha, ela corresponderá imediatamente antes da nova linha. |
31 | \z Corresponde ao final da string. |
32 | \G As partidas apontam onde a última partida terminou. |
33 | \b Corresponde aos limites da palavra quando fora dos colchetes. Corresponde ao backspace (0x08) quando entre colchetes. |
34 | \B Corresponde a limites não-palavra. |
35 | \n, \t, etc. Corresponde a novas linhas, retornos de carro, guias, etc. |
36 | \1...\9 Corresponde à enésima subexpressão agrupada. |
37 | \10 Corresponde à enésima subexpressão agrupada, se já houver correspondência. Caso contrário, refere-se à representação octal de um código de caractere. |
Exemplos de expressões regulares
Sr. Não. | Exemplo e descrição |
---|---|
1 | /ruby/ Corresponde a "ruby". |
2 | ¥ Corresponde ao sinal de iene. Os caracteres multibyte são suportados no Ruby 1.9 e Ruby 1.8. |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /[Rr]uby/ Corresponde a "Ruby" ou "ruby". |
2 | /rub[ye]/ Corresponde a "ruby" ou "rube". |
3 | /[aeiou]/ Corresponde a qualquer vogal minúscula. |
4 | /[0-9]/ Corresponde a qualquer dígito; igual a / [0123456789] /. |
5 | /[a-z]/ Corresponde a qualquer letra ASCII minúscula. |
6 | /[A-Z]/ Corresponde a qualquer letra ASCII maiúscula. |
7 | /[a-zA-Z0-9]/ Corresponde a qualquer uma das opções acima. |
8 | /[^aeiou]/ Corresponde a qualquer coisa que não seja uma vogal minúscula. |
9 | /[^0-9]/ Corresponde a qualquer coisa diferente de um dígito. |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /./ Corresponde a qualquer caractere, exceto nova linha. |
2 | /./m No modo multilinha, também corresponde a nova linha. |
3 | /\d/ Corresponde a um dígito: / [0-9] /. |
4 | /\D/ Corresponde a um não dígito: / [^ 0-9] /. |
5 | /\s/ Corresponde a um caractere de espaço em branco: / [\ t \ r \ n \ f] /. |
6 | /\S/ Corresponde a espaços não em branco: / [^ \ t \ r \ n \ f] /. |
7 | /\w/ Corresponde a um único caractere de palavra: / [A-Za-z0-9 _] /. |
8 | /\W/ Corresponde a um caractere diferente de palavra: / [^ A-Za-z0-9 _] /. |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /ruby?/ Corresponde a "rub" ou "ruby": o y é opcional. |
2 | /ruby*/ Corresponde a "rub" mais 0 ou mais ys. |
3 | /ruby+/ Corresponde a "esfregar" mais 1 ou mais ys. |
4 | /\d{3}/ Corresponde exatamente a 3 dígitos. |
5 | /\d{3,}/ Corresponde a 3 ou mais dígitos. |
6 | /\d{3,5}/ Corresponde a 3, 4 ou 5 dígitos. |
Isso corresponde ao menor número de repetições -
Sr. Não. | Exemplo e descrição |
---|---|
1 | /<.*>/ Repetição gananciosa: corresponde a "<ruby> perl>". |
2 | /<.*?>/ Não ganancioso: corresponde a "<ruby>" em "<ruby> perl>". |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /\D\d+/ Nenhum grupo: + repete-se \ d |
2 | /(\D\d)+/ Agrupado: + repete \ D \ d par |
3 | /([Rr]uby(, )?)+/ Corresponde a "Ruby", "Ruby, ruby, ruby" etc. |
Isso corresponde a um grupo anteriormente correspondido novamente -
Sr. Não. | Exemplo e descrição |
---|---|
1 | /([Rr])uby&\1ails/ Corresponde a ruby & rails ou Ruby & Rails. |
2 | /(['"])(?:(?!\1).)*\1/ String entre aspas simples ou duplas. \ 1 corresponde a tudo o que o primeiro grupo correspondeu. \ 2 corresponde ao que o segundo grupo correspondeu, etc. |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /ruby|rube/ Corresponde a "ruby" ou "rube". |
2 | /rub(y|le))/ Corresponde a "rubi" ou "rublo". |
3 | /ruby(!+|\?)/ "ruby" seguido por um ou mais! ou um? |
Ele precisa especificar a posição de correspondência.
Sr. Não. | Exemplo e descrição |
---|---|
1 | /^Ruby/ Corresponde a "Ruby" no início de uma string ou linha interna. |
2 | /Ruby$/ Corresponde a "Ruby" no final de uma string ou linha. |
3 | /\ARuby/ Corresponde a "Ruby" no início de uma string. |
4 | /Ruby\Z/ Corresponde a "Ruby" no final de uma string. |
5 | /\bRuby\b/ Corresponde a "Ruby" no limite de uma palavra. |
6 | /\brub\B/ \ B não é um limite de palavra: corresponde a "esfregar" em "rube" e "ruby", mas não sozinho. |
7 | /Ruby(?=!)/ Corresponde a "Ruby", se seguido por um ponto de exclamação. |
8 | /Ruby(?!!)/ Corresponde a "Ruby", se não for seguido por um ponto de exclamação. |
Sr. Não. | Exemplo e descrição |
---|---|
1 | /R(?#comment)/ Corresponde a "R". Todo o resto é um comentário. |
2 | /R(?i)uby/ Não diferencia maiúsculas de minúsculas enquanto corresponde a "uby". |
3 | /R(?i:uby)/ O mesmo que acima. |
4 | /rub(?:y|le))/ Grupo apenas sem criar \ 1 referência anterior. |
Pesquisar e substituir
Alguns dos métodos String mais importantes que usam expressões regulares são sub e gsub, e suas variantes no local sub! e gsub!.
Todos esses métodos executam uma operação de pesquisa e substituição usando um padrão Regexp. osub E sub! substitui a primeira ocorrência do padrão e gsub E gsub! substitui todas as ocorrências.
o sub e gsub retorna uma nova string, deixando o original inalterado, onde como sub! e gsub! modifique a string na qual são chamados.
A seguir está o exemplo -
#!/usr/bin/ruby
phone = "2004-959-559 #This is Phone Number"
# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")
puts "Phone Num : #{phone}"
# Remove anything other than digits
phone = phone.gsub!(/\D/, "")
puts "Phone Num : #{phone}"
Isso produzirá o seguinte resultado -
Phone Num : 2004-959-559
Phone Num : 2004959559
A seguir está outro exemplo -
#!/usr/bin/ruby
text = "rails are rails, really good Ruby on Rails"
# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")
# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"
Isso produzirá o seguinte resultado -
Rails are Rails, really good Ruby on Rails