4

ちょっと困っています。(私は正規表現のプロですが、scala/Java ではあまり使用しません)。長さが 11 文字の数値文字列があり、最後の 10 文字だけが必要なので、次のようにします。

val Pattern = """(\d{10})$""".r
"79283767219" match {
  case Pattern(m) => m
}

が得られますMatchErrorが、なぜですか?! 私は何を誤解しましたか?

4

3 に答える 3

11

正規表現パターンと照合する場合、正規表現パターンは文字列全体と一致する必要があります。つまり、正規表現パターンが で始まり で^終わるようなもの$です。この背後にある理由は、 amatchが右側の左側全体を分解することになっているためです。

Scala 2.10 では、次のように呼び出しunanchoredて、部分一致を行うマッチャーを取得できます。

val Pattern = """(\d{10})$""".r.unanchored

アンカーは保持されますのでご安心ください。ドロップされる文字列全体に一致が適用されることを期待しているだけです。

于 2013-01-31T14:47:52.987 に答える
7

10桁ではなく11桁なので、 で「10桁以上」を設定できます{10,}。文字列の末尾のみに一致させるには、完全なパターンを明示的に指定する必要があります。

 val Pattern = """.*(\d{10})$""".r

更新: Scala 2.10 を使用して Daniel を使用できるようになるまでは、次のunanchoredように回避できます。

Pattern.findFirstIn("79283767219")
于 2013-01-31T14:39:13.197 に答える
3

RegExあなたの例のようなインスタンスがコンストラクトでPattern使用されている場合、それは検索ではなく、一致であることに注意してください一致する値全体と一致する必要があることを意味します(Scalaの用語では、「scrutinee」(例では<code> 79283767219)と呼ばれます)。match

それはあなたの例がを取得した理由を説明していますMatchError

于 2013-01-31T14:44:41.310 に答える