我的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")
}
正则表达式在RegExBuilder中传递,但不传递scala。另外,如果有另一种方法来做这个没有正则表达式也可以。谢谢!
答案 0 :(得分:6)
正如Alan Moore指出的那样,您需要将(?i)
添加到模式的开头,以使其不区分大小写。另请注意,使用正则表达式直接匹配整个字符串。如果你想在一个更大的字符串中找到一个,你可以调用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")
}
答案 1 :(得分:3)
看起来您正在尝试进行不区分大小写的搜索,但您没有在任何地方指定。尝试将(?i)
添加到正则表达式的开头:
"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
答案 2 :(得分:1)
嗯,RE之外的其他方法可能会更加混乱。下一步可能是组合器解析器。很多随机字符串解剖代码会更加普遍,而且几乎肯定会更加痛苦。在某种程度上,合适的策略取决于你的识别器需要多么完整(以及多么严格或宽松)。例如,您的RE不接受常见格式:Rudolf Reindeer <rudy.caribou@north_pole.rth>
(即使在区分大小写后也是如此)。对于基于RE的方法,完整的RFC 2822地址解析相当具有挑战性。