Como extrair e -mail válido de string maior em scala
Pergunta
Minha versão scala 2.7.7
Estou tentando extrair um endereço de e -mail de uma string maior. A string em si segue nenhum formato. O código que eu tenho:
import scala.util.matching.Regex
import scala.util.matching._
val Reg = """\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
"yo my name is joe : joe@gmail.com" match {
case Reg(e) => println("match: " + e)
case _ => println("fail")
}
O regex passa no regexbuilder, mas não passa para o scala. Além disso, se houver outra maneira de fazer isso sem Regex, tudo bem também. Obrigado!
Solução
Como Alan Moore apontou, você precisa adicionar o (?i)
até o início do padrão para torná-lo insensível a maiúsculas. Observe também que o uso do regex corresponde diretamente à sequência inteira. Se você quiser encontrar um dentro de uma corda maior, você pode ligar findFirstIn()
ou use um dos métodos semelhantes de regex.
val reg = """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
reg findFirstIn "yo my name is joe : joe@gmail.com" match {
case Some(email) => println("match: " + email)
case None => println("fail")
}
Outras dicas
Parece que você está tentando fazer uma pesquisa insensível ao caso, mas não está especificando isso em nenhum lugar. Tente adicionar (?i)
para o início do regex:
"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
Bem, as maneiras de fazê -lo além do RES provavelmente são muito mais confusas. O próximo passo provavelmente seria o analisador de combinador. Muitos código de dissecção aleatória de cordas seriam ainda mais gerais e quase certamente muito mais dolorosos. Em parte, o que é uma tática adequada depende de quão completa (e de quão rigoroso ou branda) seu reconhecedor precisa ser. Por exemplo, a forma comum: Rudolf Reindeer <rudy.caribou@north_pole.rth>
não é aceito pelo seu RE (mesmo após a sensibilidade do caso estar relaxado). A análise de endereço RFC 2822 completa é bastante desafiadora para uma abordagem baseada em RE.