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