Scala - Expressões regulares

Este capítulo explica como Scala oferece suporte a expressões regulares por meio de Regex classe disponível no pacote scala.util.matching.

Experimente o programa de exemplo a seguir, onde tentaremos encontrar palavras Scala de uma declaração.

Exemplo

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Some(Scala)

Criamos um String e chamamos o r( )método sobre ele. Scala converte implicitamente a String em RichString e invoca esse método para obter uma instância de Regex. Para encontrar uma primeira correspondência da expressão regular, basta chamar ofindFirstIn()método. Se, em vez de encontrar apenas a primeira ocorrência, quisermos encontrar todas as ocorrências da palavra correspondente, podemos usar ofindAllIn( ) e no caso de haver várias palavras Scala disponíveis na string de destino, isso retornará uma coleção de todas as palavras correspondentes.

Você pode usar o método mkString () para concatenar a lista resultante e você pode usar uma barra vertical (|) para pesquisar maiúsculas e minúsculas de Scala e você pode usar Regex construtor em vez ou r() método para criar um padrão.

Experimente o seguinte programa de exemplo.

Exemplo

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Scala,scala

Se você quiser substituir o texto correspondente, podemos usar replaceFirstIn( ) para substituir a primeira correspondência ou replaceAllIn( ) para substituir todas as ocorrências.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Java is scalable and cool

Formando Expressões Regulares

Scala herda sua sintaxe de expressão regular de Java, que por sua vez herda a maioria dos recursos do Perl. Aqui estão apenas alguns exemplos que devem ser suficientes para atualizar -

A seguir está a tabela que lista toda a sintaxe de metacaracteres de expressões regulares disponíveis em Java.

Subexpressão Partidas
^ Corresponde ao início da linha.
$ Corresponde ao fim da linha.
. Corresponde a qualquer caractere único, exceto nova linha. Usar a opção m permite que ele corresponda a nova linha também.
[...] Corresponde a qualquer caractere único entre colchetes.
[^ ...] Corresponde a qualquer caractere único que não esteja entre colchetes
\\UMA Começo de toda a corda
\\ z Fim da string inteira
\\ Z Fim de toda a string, exceto terminador de linha final permitido.
ré* Corresponde a 0 ou mais ocorrências da expressão anterior.
re + Corresponde a 1 ou mais do anterior
ré? Corresponde a 0 ou 1 ocorrência da expressão anterior.
re {n} Corresponde exatamente ao número n de ocorrências da expressão anterior.
re {n,} Corresponde a n ou mais ocorrências da expressão anterior.
re {n, m} Corresponde a pelo menos n e no máximo m ocorrências da expressão anterior.
a | b Corresponde a a ou b.
(ré) Agrupa expressões regulares e lembra o texto correspondente.
(?: re) Agrupa expressões regulares sem lembrar o texto correspondente.
(?> re) Corresponde ao padrão independente sem retrocesso.
\\W Corresponde a caracteres de palavras.
\\W Corresponde a caracteres que não sejam palavras.
\\ s Corresponde ao espaço em branco. Equivalente a [\ t \ n \ r \ f].
\\ S Corresponde a espaços não brancos.
\\ d Corresponde aos dígitos. Equivalente a [0-9].
\\ D Corresponde a nondigits.
\\UMA Corresponde ao início da string.
\\ Z Corresponde ao final da string. Se houver uma nova linha, ela corresponderá imediatamente antes da nova linha.
\\ z Corresponde ao final da string.
\\ G As partidas apontam onde a última partida terminou.
\\ n Referência anterior para capturar o número do grupo "n"
\\ b Corresponde aos limites da palavra quando fora dos colchetes. Corresponde ao backspace (0x08) quando entre colchetes.
\\ B Corresponde a limites sem palavras.
\\ n, \\ t, etc. Corresponde a novas linhas, retornos de carro, guias, etc.
\\ Q Escape (aspas) de todos os caracteres até \\ E
\\ E Termina a citação iniciada com \\ Q

Exemplos de expressões regulares

Exemplo Descrição
. Corresponde a qualquer caractere, exceto nova linha
[Rr] uby Corresponde a "Ruby" ou "ruby"
esfregue [você] Corresponde a "rubi" ou "rube"
[aeiou] Corresponde a qualquer vogal minúscula
[0-9] Corresponde a qualquer dígito; igual a [0123456789]
[az] Corresponde a qualquer letra ASCII minúscula
[AZ] Corresponde a qualquer letra ASCII maiúscula
[a-zA-Z0-9] Combine com qualquer uma das opções acima
[^ aeiou] Corresponder a qualquer coisa que não seja uma vogal minúscula
[^ 0-9] Corresponde a qualquer coisa que não seja um dígito
\\ d Corresponde a um dígito: [0-9]
\\ D Corresponde a um não-dígito: [^ 0-9]
\\ s Corresponde a um caractere de espaço em branco: [\ t \ r \ n \ f]
\\ S Corresponder a espaços não-brancos: [^ \ t \ r \ n \ f]
\\W Corresponde a um caractere de palavra única: [A-Za-z0-9_]
\\W Corresponde a um caractere diferente de palavra: [^ A-Za-z0-9_]
rubi? Combine "esfregar" ou "rubi": o y é opcional
rubi* Corresponde a "esfregar" mais 0 ou mais ys
rubi + Corresponde a "esfregar" mais 1 ou mais ys
\\ d {3} Corresponde exatamente a 3 dígitos
\\ d {3,} Corresponde 3 ou mais dígitos
\\ d {3,5} Corresponder 3, 4 ou 5 dígitos
\\ D \\ d + Nenhum grupo: + repete-se \\ d
(\\ D \\ d) + / Agrupado: + repete par \\ D \ d
([Rr] uby (,)?) + Corresponde a "Ruby", "Ruby, ruby, ruby" etc.

Note- que cada barra invertida aparece duas vezes na string acima. Isso ocorre porque em Java e Scala uma única barra invertida é um caractere de escape em um literal de string, não um caractere regular que aparece na string. Portanto, em vez de '\', você precisa escrever '\\' para obter uma única barra invertida na string.

Experimente o seguinte programa de exemplo.

Exemplo

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

able1