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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top