1. ホーム
  2. regex

[解決済み] 正規表現を用いたScalaのグループキャプチャ

2023-07-30 09:45:02

質問

次のようなコードがあるとします。

val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).foreach(println)

私は findAllIn を返すだけだと思っていました。 483 を返しますが、その代わりに two483three . 私は unapply を使ってその部分だけ抽出することもできますが、文字列全体に対するパターンが必要です。

 val pattern = """one.*two(\d+)three""".r
 val pattern(aMatch) = string
 println(aMatch) // prints 483

のクラスを使用せずに、これを実現する他の方法はありますか? java.util のクラスを直接使用せず、unapplyを使用せずに、これを達成する他の方法はありますか?

どのように解決するのですか?

以下は、アクセスする方法の例です。 group(1) にアクセスする例です。

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

これは "483" ( ideone.comで見たように ).


見切り発車オプション

パターンの複雑さによっては、ルックアラウンドを使用して だけ にマッチさせることもできます。こんな感じになります。

val string = "one493two483three"
val pattern = """(?<=two)\d+(?=three)""".r
pattern.findAllIn(string).foreach(println)

また、上記は "483" ( ideone.comで見たように ).

参考文献