Как извлечь действительное письмо из более крупной строки в 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. Кроме того, если есть другой способ сделать это без регулярных выражений, это также будет хорошо. Спасибо!

3 ответа

Решение

Как отметил Алан Мур, вам нужно добавить (?i) в начале шаблона, чтобы сделать его без учета регистра. Также обратите внимание, что использование Regex напрямую соответствует всей строке. Если вы хотите найти один в большей строке, вы можете позвонить 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

Что ж, способы сделать это, кроме RE, вероятно, намного сложнее. Следующим шагом, вероятно, будет парсер комбинатора. Много случайного кода для разбивки строк будет еще более общим и почти наверняка намного более болезненным. Частично, какая подходящая тактика зависит от того, насколько полным (и насколько строгим или мягким) должен быть ваш распознаватель. Например, общая форма: Rudolf Reindeer <rudy.caribou@north_pole.rth> не принимается вашим RE (даже после того, как чувствительность к регистру ослаблена). Полномасштабный разбор адресов RFC 2822 довольно сложен для подхода, основанного на RE.

Другие вопросы по тегам