Как извлечь действительное электронное письмо от большей строки в Scala
Вопрос
Моя Scala версия 2.7.7
Я пытаюсь извлечь адрес электронной почты из большей строки. Сама строка не соответствует формату. код, который у меня есть:
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")
}
Regex проходит в RegexBuilder, но не проходит для Scala. Также, если есть другой способ сделать это без Regex, который также будет хорошо. Спасибо!
Решение
Как отметил Алана Мур, вам нужно добавить (?i)
к началу рисунка, чтобы сделать это нечувствительным к регистру. Также обратите внимание, что использование Regeex напрямую соответствует всей строке. Если вы хотите найти один в большей строке, вы можете позвонить findFirstIn()
Или используйте один из аналогичных методов 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")
}
Другие советы
Похоже, вы пытаетесь сделать поиск без особых случаев, но вы никуда не указываете. Попробуйте добавить (?i)
к началу регеляции:
"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
Ну, способы сделать это, кроме Res, вероятно, много Междуннее. Следующим шагом навернется, вероятно, является парсером комбинатором. Многие из случайных строковых кодекса расселения были бы еще более общими и почти наверняка намного больше. Частивая то, что подходящая тактика зависит от того, насколько полной (и насколько строгим или снисходительным) ваше распознавание должно быть. Например, общая форма: Rudolf Reindeer <rudy.caribou@north_pole.rth>
не принимается вашим RE (даже после того, как дело-чувствительность расслаблена). Полноуровневый RFC 2822 Анализ адресов довольно сложный для повторного подхода.