5

我的 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 中没有通过。此外,如果有另一种方法可以在没有正则表达式的情况下执行此操作,那也可以。谢谢!

4

3 回答 3

7

正如 Alan Moore 指出的那样,您需要(?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")
}
于 2010-05-17T02:37:21.883 回答
3

看起来您正在尝试进行不区分大小写的搜索,但您没有在任何地方指定。尝试添加(?i)到正则表达式的开头:

"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
于 2010-05-17T00:43:17.740 回答
1

好吧,除了 RE 之外的其他方法可能要复杂得多。下一步可能是组合解析器。许多随机字符串剖析代码会更加通用,几乎可以肯定会更加痛苦。在某种程度上,什么是合适的策略取决于您的识别器需要有多完整(以及多严格或多宽松)。例如,常见形式:Rudolf Reindeer <rudy.caribou@north_pole.rth>不被您的 RE 接受(即使在放宽区分大小写之后)。对于基于 RE 的方法,完整的 RFC 2822 地址解析相当具有挑战性。

于 2010-05-17T02:53:30.307 回答