如何在scala中为两个或多个正则表达式使用模式匹配

时间:2013-05-26 03:30:39

标签: scala web-crawler

我不明白如何将模式匹配用于两个或更多正则表达式。例如,我写了以下程序:

import scala.io.Source.{fromInputStream}
import java.io._
import java.net._
object craw
{
  def main(args: Array[String])
  {
    val url=new URL("http://contentexplore.com/iphone-6-amazing-looks/")
    val content=fromInputStream(url.openStream).getLines.mkString("\n")
    val x="<a href=(\"[^\"]*\")[^<]".r.
      findAllIn(content).
      toList.
      map(x=>x.substring(16,x.length()-2)).
      mkString("").
      split("/").
      mkString("").
      split(".com").
      mkString("").
      split("www.").
      mkString("").
      split(".html").
      toList
    print(x)
  }
}

以上读取所有锚标记。

import scala.io.Source.{fromInputStream}
import java.io._
import java.net._
object new1
{
  def main(args: Array[String])
  {
    val url=new URL("http://contentexplore.com/iphone-6-amazing-looks/")
    val content=fromInputStream(url.openStream).getLines.mkString("\n")
    val x="<p>.*?</p>".r.
      findAllIn(content).
      toList.
      map(x=>x.substring(3,x.length()-4)).
      mkString("").
      split("</strong>").
      mkString("").
      split("</em>").
      mkString("").
      split(";").
      mkString("").
      split("<em>").
      mkString("").
      split("<strong>").
      mkString("").
      split("&nbsp").
      toList
    print(x)
  }
}

以上内容包含所有段落标记。

我想使用模式匹配将这两个正则表达式组合到一个程序中。可以指导我如何使用两个以上的正则表达式吗?

注意这个问题与组合正则表达式有关,而与如何有效地解析HTML无关。

1 个答案:

答案 0 :(得分:4)

如评论中所述,不建议使用正则表达式来解析HTML文件(或任何其他技术,除非您确定不能/不想使用某些现有文件,如jsoup)。 / p>

出于教育目的,这里有一种通过模式匹配(使用正则表达式作为提取器)链接正则表达式的方法:

val LinkPattern = "<a href=(\"[^\"]*\")[^<]".r
val ParagraphPattern = "<p>.*?</p>".r
xmlNodeString match {
   case LinkPattern(c) => //c bound to capture group here
   case ParagraphPattern(d) => //d bound to capture group here
   case _ =>
}

注意:这假设您要解析的每个节点都是xmlNodeString,因此您需要遍历XML节点,一次匹配一个。