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