2013-07-10 81 views
2

駕駛室任何人告訴我爲什麼這不起作用,以及如何解決?斯卡拉使用正則表達式或語法匹配case語句

val aorb = "(a|b)".r 

aorb.findFirstIn("with a ") 
res103: Option[String] = Some(a) 

"with a " match { case aorb() => "have a or b" case _ => "None"} 
res102: String = None 

我盼望這場比賽語句返回「有A或B」

的實際問題是嘗試更復雜的正則表達式的一系列比賽中的輸入,並在第一次成功的模式返回一個值。

+0

總結senia的答案,它是*匹配*,而不是「搜索」或「查找」。整個監票字符串必須與RE匹配,而不僅僅是其中的一部分。 –

+0

這是一個很好的助記符(說實話),如果它是真的。實際上,在未綁定的正則表達式中,未應用會執行「find」。 –

+0

@ som-snytt:對不起,事實並非如此。 Scala的'Regex'類中的提取器/'unapply',就是這裏所說的,它固有地固定在兩端。 –

回答

7

的「錨定」的正則表達式模式匹配整個輸入匹配:

val aorb = ".*(a|b).*".r 

"with a " match { 
    case aorb(_) => "have a or b" 
    case _ => "None" 
} 
// res0: String = have a or b 

如果您捕捉你的正則表達式組也應該使用或明確忽略的結果:注意在aorb(_)_

+0

謝謝,組的_佔位符是我錯過的關鍵部分 – Gavin

+0

此答案建議您必須匹配整個字符串,並且必須捕獲組,但請參閱其他答案。 –

+0

對不起,我在一天結束時進來。我有些安慰了這樣一個事實,即高尚的和綠色檢查的答案,雖然不是全部的真相,但實際上並不是錯誤的或不正常的,正如有時在SO上的生活中發生的那樣。我的意思是不正常。 –

6

你所尋求的行爲是:

scala> val aorb = "(a|b)".r 
aorb: scala.util.matching.Regex = (a|b) 

scala> val aorbs = aorb.unanchored 
aorbs: scala.util.matching.UnanchoredRegex = (a|b) 

scala> "with a or b" match { case aorbs(x) => Some(x) case _ => None } 
res0: Option[String] = Some(a) 

爲了測試只是一個find,不要捕捉組:

scala> val aorbs = "(?:a|b)".r.unanchored 
aorbs: scala.util.matching.UnanchoredRegex = (?:a|b) 

scala> "with a or b" match { case aorbs() => true case _ => false } 
res4: Boolean = true 

scala> import PartialFunction._ 
import PartialFunction._ 

scala> cond("with a or b") { case aorbs() => true } 
res5: Boolean = true 

更新:這可能是顯而易見的,但序列通配符匹配任何捕獲組:

scala> val aorb = "(a|b).*(c|d)".r.unanchored 
aorb: scala.util.matching.UnanchoredRegex = (a|b).*(c|d) 

scala> "either an a or d" match { case aorb(_) => true case _ => false } 
res0: Boolean = false 

scala> "either an a or d" match { case aorb(_*) => true case _ => false } 
res1: Boolean = true 

對於普通的unapplycase p()匹配true。對於unapplySeq,實現可返回Seq或返回Seq的元組。如果沒有捕獲到任何內容,正則表達式將不會返回匹配組的Seq,或Nil

+1

最初的答案解決了我的直接擔憂,所以我接受了它。這是一個更完整的解決方案,我將使用。將來我會再等一會,然後再接受一個答案,看看是否有更合適的東西出現。謝謝 – Gavin

+0

@Gavin完成它是值得讚美的,完美是好的敵人,過早的優化是所有最後期限的根源。我認爲我們應該努力改善綠色檢查,實際上是爲了產生最好的答案。因此,提出一個好的答案的最初比賽是產生想法的良性競爭。 –