2016-07-30 14 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" 
} 

のマッチングに私は2番目のケースでは、コンパイラエラーを取得していますか?私はlangRegex(lang)"/(.{2}).*".rを置き換えました。これらの式は等しくなければなりませんか?

なぜこれがエラーですか?

+1

これはできないことです。プリコンパイルされたパターンが必要です。あなたができることは、内部で 'if'を使い、文字列があなたの正規表現と一致すれば何らかの文字列操作を使用するか、より単純なコードを使用することです。 –

+0

または、' 'case s if url ( "/(。{2})。*")=> s.replaceFirst( "/(.1{2}).*"、 "$ 1") '](http://ideone.com/dqlW4z) 。 –

答えて

4

と一致できるのはhttp://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.htmlであるため、これは機能しません。 最初の例では、一致の形式はStableId ‘(’ [Patterns] ‘)’で、StableIdvalueまたはobjectですが、実行するたびに変更できるdefではありません。

"/(.{2}).*".rはStableIdではないため、2番目の例は機能しません。

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

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

私は defにご langRegex定義を変更した場合、それはもうこれStableIdではありません:以下の例でも動作していないので、あなたの第二の例では動作しません。

+0

ありがとう、非常に便利です。 – Teimuraz

+0

@moreoあなたの質問に答えた場合、これを受け入れられた回答としてチェックすることもできます –