如何使用正则表达式进行模式匹配

时间:2013-01-16 20:46:24

标签: scala

下面的代码是我用来解析文件中的href链接:

  def parseFile(){
    val source = scala.io.Source.fromFile("C:\\Users\\Adrian\\Desktop\\parsefile.txt")
    val lines = source.getLines
    val Pattern = "\\s*(?i)href\\s*=\\s*(\\\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"

    for (line <- source.getLines) {
        println(line)
    line match {
        case Pattern(c) => println(c)
        case _ => None
    }
   }

    source.close ()
  }

parsefile中的一个示例行:

  <A HREF="www.google.com" title="test">test</A>

但是我收到了这个Eclipse编译时错误:

Multiple markers at this line
    - not found: value c
    - value Pattern is not a case class constructor, nor does it have an unapply/unapplySeq method

如何声明'c'以访问捕获组String?

我的代码基于此问题的接受答案:

How to pattern match using regular expression in Scala?使用的代码是:

val Pattern = "([a-cA-C])".r
word.firstLetter match {
   case Pattern(c) => c bound to capture group here
   case _ =>
}

有关解析文件欢迎的替代方法的任何建议。

2 个答案:

答案 0 :(得分:5)

您的代码之间存在显着差异:

val Pattern = "\\s*(?i)href\\s*=\\s*(\\\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"

和示例:

val Pattern = "([a-cA-C])".r

注意结尾.r。这会将String转换为正则表达式模式。正则表达式模式有一个unaplySeq方法,因此它适用于模式匹配。

答案 1 :(得分:2)

Pattern的类型为String,但应为Regex。只需将.r的调用添加到您的模式字符串中即可。