Gostaria de encontrar uma correspondência entre a primeira letra de uma palavra e uma das letras de um grupo como "ABC". No pseudocódigo, isso pode ser algo como:
case Process(word) =>
word.firstLetter match {
case([a-c][A-C]) =>
case _ =>
}
}
Mas como pego a primeira letra do Scala em vez do Java? Como expresso a expressão regular corretamente? É possível fazer isso dentro de uma classe de caso ?
[a-cA-C]
essa expressão regular.Traversable
(comoList
eArray
), se você quiser os primeiros 3 caracteres, tente"my string".take(3)
, pela primeira"foo".head
Respostas:
Você pode fazer isso porque expressões regulares definem extratores, mas precisa primeiro definir o padrão regex. Não tenho acesso a um Scala REPL para testar isso, mas algo assim deve funcionar.
fonte
val Pattern = "[a-cA-C]".r
não funcionará. Isso ocorre porque os casos de correspondência são usadosunapplySeq(target: Any): Option[List[String]]
, que retornam os grupos correspondentes.val r = "[A-Ca-c]".r ; 'a' match { case r() => }
.. scala-lang.org/api/current/#scala.util.matching.Regexval r = "([A-Ca-c])".r ; "C" match { case r(_*) => }
.Desde a versão 2.10, pode-se usar o recurso de interpolação de strings do Scala:
Melhor ainda, é possível vincular grupos de expressão regular:
Também é possível definir mecanismos de ligação mais detalhados:
Um exemplo impressionante sobre o que é possível
Dynamic
é mostrado na postagem do blog Introdução ao Tipo Dinâmico :fonte
$
sinal como um padrão de final de linha: o compilador reclama da falta de terminação de string.case p.firstName.lastName.Map(...
padrão - como diabos eu leio isso?Regex
sempre que a correspondência é verificada. E essa é uma operação bastante cara que envolve a compilação do padrão regex.Como delnan apontou, a
match
palavra - chave em Scala não tem nada a ver com expressões regulares. Para descobrir se uma string corresponde a um regex, você pode usar oString.matches
método Para descobrir se uma string começa com a, b ou c em letras minúsculas ou maiúsculas, a regex ficaria assim:Você pode ler essa expressão regular como "um dos caracteres a, b, c, A, B ou C seguido de qualquer coisa" (
.
significa "qualquer caractere" e*
"zero ou mais vezes", portanto ". *" É qualquer sequência de caracteres) .fonte
Para expandir um pouco a resposta de Andrew : O fato de expressões regulares definirem extratores pode ser usado para decompor muito bem as substrings correspondidas pelo regex usando a correspondência de padrões de Scala, por exemplo:
fonte
[]
), o sinal de intercalação indica negação, então[^\s]
significa 'espaço não branco'.String.matches é a maneira de fazer a correspondência de padrões no sentido de expressão regular.
Mas, como um exemplo prático, o word.firstLetter no código Scala real se parece com:
Scala trata Strings como uma sequência de Char, portanto, por algum motivo, você deseja obter explicitamente o primeiro caractere do String e combiná-lo, você pode usar algo como isto:
Não estou propondo isso como a maneira geral de fazer a correspondência de padrões de regex, mas está alinhado com a abordagem proposta para primeiro encontrar o primeiro caractere de uma String e depois corresponder a um regex.
EDIT: Para ser claro, a maneira que eu faria isso é, como outros já disseram:
Só queria mostrar um exemplo o mais próximo possível do seu pseudocódigo inicial. Felicidades!
fonte
"Cat"(0).toString
poderia ser mais claramente escrito como"Cat" take 1
, imho.val r = "[A-Ca-c]".r ; "cat"(0) match { case r() => }
,.Observe que a abordagem da resposta de @ AndrewMyers corresponde a toda a string à expressão regular, com o efeito de ancorar a expressão regular nas duas extremidades da string usando
^
e$
. Exemplo:E sem
.*
no final:fonte
val MY_RE2 = "(foo|bar)".r.unanchored ; "foo123" match { case MY_RE2(_*) => }
. Mais linguisticamente,val re
sem todas as letras maiúsculas.Primeiro, devemos saber que a expressão regular pode ser usada separadamente. Aqui está um exemplo:
Segundo, devemos observar que combinar expressão regular com correspondência de padrões seria muito poderoso. Aqui está um exemplo simples.
De fato, a própria expressão regular já é muito poderosa; a única coisa que precisamos fazer é torná-lo mais poderoso pelo Scala. Aqui estão mais exemplos no Scala Document: http://www.scala-lang.org/files/archive/api/current/index.html#scala.util.matching.Regex
fonte