web-dev-qa-db-ja.com

Scala正規表現を使用したキャプチャグループ

このコードがあるとしましょう:

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

findAllIn483のみを返すと予想していましたが、代わりにtwo483threeを返しました。 unapplyを使用してその部分のみを抽出できることはわかっていますが、次のような文字列全体のパターンが必要です。

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

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

62
Geo

以下は、各マッチのgroup(1)にアクセスする方法の例です:

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

これは、"483"ideone.comで見られるように )を出力します。


ルックアラウンドオプション

パターンの複雑さに応じて、ルックアラウンドを使用してonlyを必要な部分に一致させることもできます。次のようになります。

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

上記も"483"ideone.comで見られるように )を出力します。

参照資料

92
val string = "one493two483three"
val pattern = """.*two(\d+)three.*""".r

string match {
  case pattern(a483) => println(a483) //matched group(1) assigned to variable a483
  case _ => // no match
}
29
caiiiycuk

group(1)を見たいと思っていますが、現在group(0)を見ています。これは「一致した文字列全体」です。

この正規表現チュートリアル を参照してください。

14
Stephen

開始Scala 2.13、正規表現ソリューションの代替として、 文字列補間の適用解除 によってStringをパターンマッチすることも可能です。

"one493two483three" match { case s"${x}two${y}three" => y }
// String = "483"

あるいは:

val s"${x}two${y}three" = "one493two483three"
// x: String = one493
// y: String = 483

一致しない入力が予想される場合、デフォルトのパターンガードを追加できます。

"one493deux483three" match {
  case s"${x}two${y}three" => y
  case _                   => "no match"
}
// String = "no match"
1
Xavier Guihot
def extractFileNameFromHttpFilePathExpression(expr: String) = {
//define regex
val regex = "http4.*\\/(\\w+.(xlsx|xls|Zip))$".r
// findFirstMatchIn/findAllMatchIn returns Option[Match] and Match has methods to access capture groups.
regex.findFirstMatchIn(expr) match {
  case Some(i) => i.group(1)
  case None => "regex_error"
}
}
extractFileNameFromHttpFilePathExpression(
    "http4://testing.bbmkl.com/document/sth1234.Zip")
1
Gaurav Khare