我不明白如何将模式匹配用于两个或更多正则表达式。例如,我写了以下程序:
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(" ").
toList
print(x)
}
}
以上内容包含所有段落标记。
我想使用模式匹配将这两个正则表达式组合到一个程序中。可以指导我如何使用两个以上的正则表达式吗?
注意这个问题与组合正则表达式有关,而与如何有效地解析HTML无关。
答案 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节点,一次匹配一个。