89 votes

Groupe de capture Scala utilisant REGEX

Disons que j'ai ce code :

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

Je m'attendais findAllIn ne revienne que 483, mais au lieu de cela, il est revenu two483three. Je sais que je pourrais utiliser unapply pour extraire seulement cette partie, mais je devrais avoir un motif pour toute la chaîne, quelque chose comme :

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

Existe-t-il un autre moyen d'y parvenir, sans utiliser les classes de java.util directement, et sans utiliser unapply ?

52voto

caiiiycuk Points 26
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
}

16voto

Stephen Points 16714

Vous voulez regarder group(1), vous regardez actuellement group(0), qui est "la chaîne entière".

Voir ce tutoriel regex.

5voto

Gaurav Khare Points 945
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")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X