2014-04-06 55 views
1

我對Scala非常陌生,尤其是令人敬畏的模式匹配。但是,我發現這個代碼不起作用。我創建了一個包含匹配詞的「詞典」,然後我使用了理解,因此每一行都會與詞典中的詞匹配。Scala模式匹配無法匹配特定字

這是用來創建正則表達式的地圖。

val dictionary = Map(
    """will""" -> 1, 
    """going to""" -> 2, 
    """future""" -> 3 
) 

這是主要的for循環:

for (
     ln <- file.getLines(); 
     (word, loc) <- dictionary 
    ){ 
     val regex = word.r 
     ln match { 
     case regex(ln) => {totalLine += 1 
      println("Match detected: " + word) 
      val originalElem = doc.BOWVector(dictionary.get(ln).get) 
      doc.BOWVector.updated(dictionary.get(ln).get, originalElem+1) //vector is updated 
      } 
     case _ => {totalLine += 1} 
     } 
} 

當我使用ln.contains("will")和它的作品!然而,正則表達式不起作用。爲什麼?

回答

2

靠近一點:

scala> for (ln <- List("I will go"); (word, loc) <- dictionary) { 
    | val r = word.r.unanchored 
    | ln match { case r() => println(s"Yes $word") ; case _ => println(s"No $word") }} 
Yes will 
No going to 
No future 

默認錨定正則表達式是^will$

如果您不想擔心捕獲組,請使用「序列通配符」。

scala> for (ln <- List("I will go"); (word, loc) <- dictionary) { 
    | val r = word.r.unanchored 
    | ln match { case r(_*) => println(s"Yes $word") ; case _ => println(s"No $word") }} 
Yes will 
No going to 
No future 

scala> val dictionary = Map("wi(l*)" -> 1) 
dictionary: scala.collection.immutable.Map[String,Int] = Map(wi(l*) -> 1) 

scala> for (ln <- List("I will go"); (word, loc) <- dictionary) { 
    | val r = word.r.unanchored 
    | ln match { case r(_*) => println(s"Yes $word") ; case _ => println(s"No $word") }} 
Yes wi(l*) 

scala> for (ln <- List("I will go"); (word, loc) <- dictionary) { 
    | val r = word.r.unanchored 
    | ln match { case r(ells) => println(s"Yes $ells") ; case _ => println(s"No $word") }} 
Yes ll 
+0

謝謝!其實'.unanchored'做了很大的改變,並使這個程序的工作! –

1

的問題是,scala.util.matching.Regex.unapplySeq收益匹配的組

如果正則表達式不包含組(你的情況),在模式匹配它應該在的形式使用:

scala> val regex1 = "foo".r 
regex1: scala.util.matching.Regex = foo 

scala> "foo" match { case regex1() => "match" } 
res0: String = match 

而且隨着匹配組是將

scala> val regex2 = "(foo)".r 
regex2: scala.util.matching.Regex = (foo) 

scala> "foo" match { case regex2(group) => s"match $group" } 
res1: String = match foo 

組的數量可以是任意的,但在case聲明參數的數目應匹配

scala> val regex3 = "(foo)(\\d)".r 
regex3: scala.util.matching.Regex = (foo)(\d) 

scala> "foo1" match { case regex3(word, digit) => s"match $word $digit" } 
res2: String = match foo 1 

另外,參見實施例爲unapplySeq scaladoc

+0

這就是我懷疑的!模式匹配實際上是一個拆箱工具,而不是簡單的匹配(case/switch)。 –

+0

Emmm ..出於某種原因,我不知道,該計劃仍然無法正常工作。 –