2016-07-30 100 views
0

我已經在與模式匹配的正則表達式:斯卡拉:正則表達式直接模式匹配塊

val url = "/en/about" 
val langRegex = "/(.{2}).*".r 

val lang = url match { 
    case langRegex(lang) => lang 
    case _ => "en" 
} 

但我想實現這樣的事情(我不想創建正則表達式額外的變量,而是把它直接在匹配塊)

val url = "/en/about" 
val lang = url match { 
    case "/(.{2}).*".r(lang) => lang 
    case _ => "en" 
} 

我在第二種情況下收到編譯器錯誤?我只是用langRegex(lang)「/(.{2}).*".r,這些表達應該是相等的,不應該嗎?

爲什麼這是一個錯誤?

+1

問題是你不能這樣做,你需要一個預編譯模式。你可以做的就是在裏面使用'if',如果字符串匹配你的正則表達式就使用一些字符串操作,或者只是使用一個簡單的代碼,如http://ideone.com/CJMS1A –

+0

或者使用['case s if url .matches(「/(。{2})。*」)=> s.replaceFirst(「/(.{2}).*」,「$ 1」)'](http://ideone.com/dqlW4z) 。 –

回答

4

這不起作用,因爲您只能匹配,如http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html中所定義。 在第一個示例中,您的匹配格式爲StableId ‘(’ [Patterns] ‘)’,其中StableIdvalueobject,但不是def,可以隨時更改它的執行時間。

你的第二個例子不起作用,因爲"/(.{2}).*".r不是StableId。你的第二個例子是行不通的,因爲下面的例子中也沒有工作:

val url = "/en/about" 
def langRegex = "/(.{2}).*".r 

val lang = url match { 
    case langRegex(lang) => lang 
    case _ => "en" 
} 

,我改變了你langRegex定義爲def和它因此不是StableId了。

+0

謝謝,非常有用。 – Teimuraz

+0

@moreo如果它回答你的問題,你也可以檢查接受的答案 –