Как извлечь действительное письмо из более крупной строки в 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.