4

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

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 无关。

4

1 回答 1

4

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

出于教育目的,这是将正则表达式与模式匹配链接起来的一种方法(使用正则表达式作为提取器):

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 节点,一次匹配一个。

于 2013-05-26T13:29:54.653 回答