2016-07-30 2 views
0

Я следующее регулярное выражение с сопоставления с образцом:Scala: регулярное выражение непосредственно в согласующего шаблон блока

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] ‘)’, где 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 больше.

+0

спасибо, очень полезно. – Teimuraz

+0

@moreo вы также можете проверить это как принятый ответ, если он отвечает на ваш вопрос –

Смежные вопросы