斯卡拉:正则表达式直接模式匹配块

问题描述:

我已经在与模式匹配的正则表达式:斯卡拉:正则表达式直接模式匹配块

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) 。 –

这不起作用,因为您只能匹配,如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如果它回答你的问题,你也可以检查接受的答案 –