Domanda

La mia scala versione 2.7.7

Nel tentativo di estrarre un indirizzo di posta elettronica da una stringa più grande. la stringa stessa segue alcun formato. il codice che ho:

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")
}

il Regex passa RegExBuilder ma non passa per la scala. Anche se c'è un altro modo per fare questo senza regex che sarebbe bene anche. Grazie!

È stato utile?

Soluzione

Come Alan Moore ha sottolineato, è necessario aggiungere il (?i) all'inizio del pattern per renderlo maiuscole e minuscole. Si noti inoltre che l'utilizzo del Regex corrisponde direttamente l'intera stringa. Se si vuole trovare uno all'interno di una stringa più grande, è possibile chiamare findFirstIn() o utilizzare uno dei metodi simili di 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")
}

Altri suggerimenti

Sembra che si sta cercando di fare una ricerca case-insensitive, ma non si specifica che nessuna parte. Prova ad aggiungere (?i) all'inizio della regex:

"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r

Bene, i modi per farlo diverso da ER sono probabilmente un sacco Messier. Il passo successivo sarebbe probabilmente il parser un combinatore. Un sacco di codice stringa casuale dissezione sarebbe ancora più generale, e quasi certamente un bel po 'più doloroso. In parte ciò che è una tattica adatta dipende da come completo (e come oggettiva o indulgente) il vostro riconoscitore deve essere. Per esempio, la forma comune: Rudolf Reindeer <rudy.caribou@north_pole.rth> non è accettato dalla tua RE (anche dopo il caso-sensibilità è rilassato). In piena regola RFC 2822 indirizzo di analisi è piuttosto impegnativo per un approccio RE-based.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top