Как извлечь действительное письмо из более крупной строки в Scala - PullRequest
4 голосов
/ 17 мая 2010

Моя версия 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 ]

6 голосов
/ 17 мая 2010

Как отметил Алан Мур, вам нужно добавить (?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")
}
3 голосов
/ 17 мая 2010

Похоже, вы пытаетесь выполнить поиск без учета регистра, но вы нигде не определяете это. Попробуйте добавить (?i) в начало регулярного выражения:

"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
1 голос
/ 17 мая 2010

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

...