4

正規表現の括弧は、match/case ステートメントでは機能しないようです。たとえば、次のコード

val pat1 = """ab""".r
val pat2 = """(a)(b)""".r
val pat3 = """((a)(b))""".r
val pat4 = """((a)b)""".r
val pat5 = """(ab)""".r
"ab" match {
  case pat1(x) => println("1 " + x)
  case pat2(x) => println("2 " + x)
  case pat3(x) => println("3 " + x)
  case pat4(x) => println("4 " + x)
  case pat5(x) => println("5 " + x)
  case _ => println("None of the above")
}

「5 ab」と表示されますが、どのパターンも一致すると予想していました。「(...)?」を使いたい オプションの要素ですが、できません。これに関連して、(?m) が機能しません。私のパターンは、マッチ/ケース式の外でも問題なく動作します。Scala が match/case 式で正規表現をどのように処理するかを誰かに説明してもらえますか?

Scala でトークナイザーを作成しようとしています。

4

2 に答える 2

8

RegexunapplySeqではなくを定義しunapplyます。これは、各グループを独自の変数で取得することを意味します。また、小文字のマッチャーがいくつかのインスタンス (つまり、パラメーター) で機能する場合もありますが、実際には大文字を使用する必要があります。したがって、機能するのは次のとおりです。

val Pat1 = """ab""".r
val Pat2 = """(a)(b)""".r
val Pat3 = """((a)(b))""".r
val Pat4 = """((a)b)""".r
val Pat5 = """(ab)""".r
def no() { println("No match") }
"ab" match { case Pat1() => println("Pat1"); case _ => no }
"ab" match { case Pat2(x,y) => println("Pat2 "+x+" "+y); case _ => no }
"ab" match { case Pat3(x,y,z) => println("Pat3 "+x+" "+y+" "+z); case _ => no }
"ab" match { case Pat4(x,y) => println("Pat4 "+x+" "+y); case _ => no }
"ab" match { case Pat5(x) => println("Pat5 "+x); case _ => no }

(必ずマッチします。)

すべての一致が必要な場合は、使用します@ _*

"ab" match { case Pat3(w @ _*) => println(w); case _ => no }

言ってる意味が(?a)わからないので何が悪いのかわかりません。(?a)(?:a)(または と(a?)または と)混同しないでください(a)?

于 2012-11-20T22:47:20.030 に答える
0

group(1)各試合にアクセスする方法の例を次に示します。

val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).matchData foreach {
  m => println(m.group(1))
}

このデモをここでテストしてください。

于 2012-11-20T22:49:28.620 に答える