斯卡拉:正则表达式直接模式匹配块
我已经在与模式匹配的正则表达式:斯卡拉:正则表达式直接模式匹配块
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,这些表达应该是相等的,不应该吗?
为什么这是一个错误?
这不起作用,因为您只能匹配值,如http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html中所定义。 在第一个示例中,您的匹配格式为StableId ‘(’ [Patterns] ‘)’
,其中StableId
为value
或object
,但不是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了。
谢谢,非常有用。 – Teimuraz
@moreo如果它回答你的问题,你也可以检查接受的答案 –
问题是你不能这样做,你需要一个预编译模式。你可以做的就是在里面使用'if',如果字符串匹配你的正则表达式就使用一些字符串操作,或者只是使用一个简单的代码,如http://ideone.com/CJMS1A –
或者使用['case s if url .matches(“/(。{2})。*”)=> s.replaceFirst(“/(.{2}).*”,“$ 1”)'](http://ideone.com/dqlW4z) 。 –