1
votes

comment utiliser regex pour extraire la chaîne de correspondance dans scala?

La chaîne est donnée sous la forme

def parser(filename: String):String = {
    val extractDate = """(\d{8}).*""".r
    val extractDate(dd) = filename;
    dd;
}

La fonction Parser pour extraire "20200707" comme ci-dessous.

var filedate = parser("test_pb_PP_Quality_2-Report_20200707.csv");

Mais son erreur renvoie comme Exception dans le thread "main" scala.MatchError:


0 commentaires

3 Réponses :


1
votes

Vous pouvez essayer d'utiliser la String # replaceAll de Java ici:

20200707

Ceci imprime:

def parser(filename: String):String = {
    val extractDate = filename.replaceAll(".*(\\d{8}).*", "$1");
    extractDate;
}

println(parser("test_pb_PP_Quality_2-Report_20200707.csv"))


2 commentaires

pourrions-nous utiliser regex pour le même?


Eh bien ... cette réponse est à l'aide de regex, si vous regardez de près :-)



1
votes

Autorisez simplement du texte avant les nombres en ajoutant . * au début de l'expression régulière:

def parser(filename: String):String = {
    val extractDate = """.*(\d{8}).*""".r
    filename match {
      case extractDate(dd) => dd
      case _ => throw new RuntimeException(s"Invalid filename $filename")
    }
}

Vous pouvez également utiliser une expression de correspondance pour gérer le cas où le nom de fichier n'a pas le format attendu:

def parser(filename: String):String = {
    val extractDate = """.*(\d{8}).*""".r
    val extractDate(dd) = filename;
    dd;
}


0 commentaires

4
votes

Par défaut, une expression régulière créée avec la méthode .r est ancrée, ce qui signifie qu'elle doit correspondre à la chaîne entière. (pensez à votre expression régulière comme étant incluse dans ^ et $ )

Vous pouvez utiliser une expression régulière non ancrée à la place:

def parser(filename: String): Option[String] = {
  """\d{8}""".r.findFirstIn(filename)
}

parser("test_pb_PP_Quality_2-Report_20200707.csv") match {
  case Some(datetime) => // do something
  case None           => // handle this case
}

Cela fonctionne, mais c'est une mauvaise pratique car "l'analyse" lèverait une exception si votre entrée ne correspond pas. Plus idiomatique serait de renvoyer une Option [String] et de la gérer sur le site appelant. Par exemple:

def parser(filename: String):String = {
  val extractDate = """(\d{8})""".r.unanchored
  val extractDate(dd) = filename
  dd
}


0 commentaires