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

Expressões Regulares Scala

O Scala usa o pacote scala.util.matching para Regex Classe para suportar expressões regulares. O exemplo a seguir demonstra a busca de palavras usando expressão regular Scala :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala é Scalable e divertido"
      
      println(pattern findFirstIn str)
   }
}

Executar o código acima, o resultado de saída será:

$ scalac Test.scala 
$ scala Test
Some(Scala)

No exemplo, foi construído um objeto Regex usando o método r() da classe String.

Em seguida, use o método findFirstIn para encontrar o primeiro item correspondente.

Se precisar visualizar todos os itens correspondentes, você pode usar o método findAllIn.

Você pode usar o método mkString( ) para conectar strings de resultados de correspondência de expressão regular e pode usar o pipe | para definir diferentes padrões:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // A primeira letra pode ser maiúscula S ou minúscula s
      val str = "Scala é escalável e divertido"
      
      println((pattern findAllIn str).mkString(","))   // Use vírgula , para conectar os resultados de retorno
   }
}

Executar o código acima, o resultado de saída será:

$ scalac Test.scala 
$ scala Test
Scala,scala

Se precisar substituir o texto correspondente por uma palavra-chave específica, você pode usar replaceFirstIn( ) Método para substituir o primeiro item correspondente, usando replaceAllIn( ) Método substitui todos os itens correspondentes, exemplo a seguir:

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala é escalável e divertido"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Executar o código acima, o resultado de saída será:

$ scalac Test.scala 
$ scala Test
Java é escalável e divertido

Expressão regular

A expressão regular do Scala herda as regras de sintaxe do Java, e o Java usa principalmente as regras da linguagem Perl.

Na tabela a seguir, apresentamos algumas regras de expressão regular comuns:

ExpressãoRegra de expressão regular
^ Coincide com a posição inicial da string de entrada.
$Coincide com a posição final da string de entrada.
.Corresponde a qualquer caractere individual diferente de "\r\n".
[...]Conjunto de caracteres. Corresponde a qualquer caractere incluído. Por exemplo, "[abc]" combina com "plain" em "a".
[^...]Conjunto de caracteres inverso. Corresponde a qualquer caractere não incluído. Por exemplo, "[^abc]" combina com "plain" em "p", "l", "i", "n".
\\ACorresponde à posição inicial da string de entrada (sem suporte para múltiplas linhas)
\\zFim da string (semelhante a $, mas não afetado pela opção de processamento de linhas múltiplas)
\\ZFim da string ou fim da linha (não afetado pela opção de processamento de linhas múltiplas)
re*Repete zero vezes ou mais
re+Repete uma vez ou mais
re?Repete zero vezes ou uma vez
re{ n}Repete n vezes
re{ n,}Repete n vezes ou mais
re{ n, m}Repete n vezes até m vezes
a|bCorresponde a a ou b
(re)Corresponde a re, e captura o texto em um grupo automaticamente nomeado
(?: re)Corresponde a re, não captura o texto correspondente, nem atribui um número de grupo a este grupo
(?> re)Expressão regular glotônica
\\wCorresponde a letra ou número ou sublinhado ou caractere chinês
\\.\W}Corresponde a qualquer caractere que não seja uma letra, número, sublinhado ou caractere chinês
\\sCorresponde a qualquer espaço em branco, equivalente a [\t\n\r\f]
\\SCorresponde a qualquer caractere que não seja um espaço em branco
\\dCorresponde a números, semelhante a [0-9]
\\DCorresponde a qualquer caractere não numérico
\\GInício da busca atual
\\nCaractere de nova linha
\\bGeralmente é uma posição de delimitador de palavra, mas se usado dentro de um caractere classe representa o caractere de retrocesso
\\BCorresponde a posição não inicial ou final de palavra
\\tTabulação
\\QInício da citação:\Q(a+b)*3\E Pode combinar o texto "(a+b)*3".
\\EFim da citação:\Q(a+b)*3\E Pode combinar o texto "(a+b)*3".

Exemplo de expressão regular

ExemploDescrição
.Corresponde a qualquer caractere individual diferente de "\r\n".
[Rr]ubyCorresponde a "Ruby" ou "ruby"
rub[ye]Corresponde a "ruby" ou "rube"
[aeiou]Corresponde a letras minúsculas: aeiou
[0-9]Corresponde a qualquer número, semelhante a [0123456789]
[a-z]Corresponde a qualquer letra minúscula ASCII
[A-Z]Corresponde a qualquer letra maiúscula ASCII
[a-zA-Z0-9]Corresponde a números e letras maiúsculas e minúsculas
[^aeiou]Corresponde a caracteres diferentes de aeiou
[^0-9]Corresponde a caracteres diferentes de números
\\dCorresponde a números, semelhante a: [0-9]
\\DCorresponde a não números, semelhante a: [^0-9]
\\sCorresponde a espaços em branco, semelhante a: [ \t\r\n\f]
\\SCorresponde a não espaços em branco, semelhante a: [^ \t\r\n\f]
\\wCorresponde a letras, números, sublinhado, semelhante a: [A-Za-z0-9_]
\\.\W}Correspondência de não-letra, número, sublinhado, semelhante a: [^A-Za-z0-9_]
ruby?Correspondência de "rub" ou "ruby":  y é opcional
ruby*Correspondência de "rub" mais 0 número ou múltiplos de y.
ruby+Correspondência de "rub" mais 1 do y.
número ou múltiplos números.3}número ou múltiplos 3 ou
número ou múltiplos números.3Correspondência exata, 3 },
número ou múltiplos números.3\\.{5}, 3 Correspondência4 número 5 ou
número.+\\.\d + Sem grupo:
(\\D\\d)+/Grupo: + Repetição de \D\d
([Rr]uby(, )?)+Correspondência de "Ruby"、"Ruby, ruby, ruby",etc

Observe que cada caractere no gráfico acima usou duas barras invertidas. Isso se deve ao fato de que o caractere de escape é um caractere de escape em strings Java e Scala. Portanto, se você quiser imprimir \, você precisa escrever \\ na string para obter uma barra invertida. Veja o exemplo a seguir:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 e fresco"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Executar o código acima, o resultado de saída será:

$ scalac Test.scala 
$ scala Test
able1