2016-03-31 3 views
4

以下の例では、私は_ *用法とちょっと混乱しています。これは異なった振る舞いをしており、これを理解することは完全に失われています。_ *用法はスカラパターンマッチングです

val p1="scala".r 
val p2="([0-9]+[.]?[0-9]*|[.][0-9]+)$".r 

"scala" match {case p1(_) => true case _ => false } // return false 


"scala" match {case p1(_ *) => true case _ => false } // return true 

"9" match {case p2(_) => true case _ => false} // return true 

ありがとうございました。

+0

を参照してください:代替、あなたはあなたの最初の行(義務最初のキャプチャグループを表す_がここに削除される)とcase p1()を使用することができ、そしてそれはあまりにも、動作するよう

'match'はパターンのキャプチャグループを必要とします。 '_ *'では、この要件は無視されます。 –

答えて

3

case(_)を使用しているため、matchにパターン内に少なくとも1つのキャプチャグループが必要です。これは、 "マッチケース"がキャプチャグループの値を返すunapplySeq(target: Any): Option[List[String]]を使用し、キャプチャされた値の1つに_が存在する必要があるためです。 _ *では、この要件は無視されます。 Scala regex referenceを参照してください:

任意のグループを無視して、正規表現がマッチするかどうかだけを確認するには、シーケンスワイルドカード使用:

"2004-01-20" match { case date(_*) => "It's a date!" }

をごp2が故に、キャプチャグループが含まれています最後の行はtrueを返します。

p1にはキャプチャグループが含まれていないため、最初のmatchは失敗します。 2番目は*でこの要件を無効にしてからではありません。

"scala" match {case p1() => true case _ => false }) // return true 

このIDEONE demo

+0

私はより多くの説明とサンプルのデモで答えを更新しました。 IDEONEの場合 –

+0

incr 1 - その前にそれを聞いたことがない。 –

+1

@WiktorStribiżewありがとう – John

関連する問題