Travailler avec Regex dans Scala
-
Classe
Regex
dans Scala - Trouver des correspondances dans le texte en Scala
-
Utiliser
Regex
pour remplacer un texte dans Scala -
Utilisez
Regex
pour extraire des valeurs dans Scala - Conclusion
Les expressions régulières définissent un modèle commun utilisé pour faire correspondre les données d’entrée. Ceux-ci sont très utiles pour la correspondance de modèles et le traitement ou l’analyse de texte.
Dans cet article, nous allons apprendre à travailler avec Regex (expressions régulières) dans Scala.
Classe Regex
dans Scala
Regex
est une classe dans Scala qui est importée de scala.util.matching.Regex
, basée sur le package Java java.util.regex
, qui est largement utilisé pour la correspondance de modèles et l’analyse de texte. Les objets Regex
peuvent être créés de deux manières.
La première méthode consiste à créer explicitement l’objet de classe Regex
.
val x = new Regex("you")
La seconde méthode consiste à utiliser la méthode r
.
val x = "You".r
Regardons différents cas d’utilisation d’expressions régulières avec Regex
.
Trouver des correspondances dans le texte en Scala
Trouver des correspondances dans le texte est l’un des cas d’utilisation les plus courants de Regex.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val x = new Regex("Tony")
val text = "Iron man is also known as Tony Stark. Tony is an Avenger"
println(x findFirstIn text)
}
}
Production:
Some(Tony)
Dans le code ci-dessus, nous avons utilisé la méthode findFirstIn
pour trouver la première correspondance de l’expression régulière, et la méthode renvoie un objet Option[String]
.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println((reg findAllIn text).mkString(","))
}
}
Production:
01-011,30-059
Dans l’exemple ci-dessus, nous avons utilisé la méthode findAllIn
pour trouver toutes les correspondances et renvoyer le MatchIterator
. Nous avons ensuite utilisé la méthode mkString
pour convertir la sortie en une chaîne séparée par un ,
(virgule).
Nous avons aussi la méthode findFirstMatchIn
. Elle fonctionne comme la méthode findFirstIn
mais renvoie Option[Match]
.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
val result = reg.findFirstMatchIn(text)
println(Some("011"), for (x <- result) yield x.group(2))
}
}
Production:
(Some(011),Some(011))
Utiliser Regex
pour remplacer un texte dans Scala
Ceci est un autre cas d’utilisation de Regex
qui remplace le texte. Parfois, lors de l’analyse de texte, nous avons peut-être remplacé une partie de celui-ci par autre chose.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceFirstIn(text, "1234"))
}
}
Production:
He lives in Warsaw 1234 and she lives in Cracow 30-059
Dans le code ci-dessus, nous avons utilisé la méthode replaceFirstIn
pour remplacer la première correspondance trouvée dans le texte par la chaîne "1234"
.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
// Main method
def main(args: Array[String])
{
val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"
println(reg replaceAllIn(text, "1234"))
}
}
Production:
He lives in Warsaw 1234 and she lives in Cracow 1234
Dans le code ci-dessus, nous avons utilisé la méthode replaceAllIn
, qui remplace toutes les correspondances trouvées dans le texte par "1234"
.
Utilisez Regex
pour extraire des valeurs dans Scala
Lorsque nous trouvons une correspondance avec des expressions régulières, nous pouvons utiliser Regex
pour extraire des valeurs à l’aide de la correspondance de motifs.
Exemple de code :
import scala.util.matching.Regex
object myClass {
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val time = "12:20:01.411" match {
case timestamp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
Production:
It is 20 minutes after 12
Dans Scala, Regex
par défaut se comporte comme si le motif était ancré
. Par exemple, le motif est mis au milieu des caractères ^
et $
comme ^pattern$
, mais on peut supprimer ces caractères en utilisant la méthode unanchored
, qui est présente dans la classe UnanchoredRegex
.
Avec cette aide, nous pouvons avoir du texte supplémentaire dans notre chaîne et toujours trouver ce dont nous avons besoin.
Exemple de code :
import scala.util.matching.Regex
object myClass
{
def main(args: Array[String]) {
val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
val temp = timestamp.unanchored
val time = "It is 12:20:01.411 in New York" match {
case temp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
}
}
}
Production:
It is 20 minutes after 12
Java hérite la plupart de ses expressions régulières et de ses fonctionnalités Regex
du langage de programmation Perl, et Scala hérite sa syntaxe d’expressions régulières de Java.
Regardons quelques-unes des expressions régulières couramment utilisées de Scala tirées de Java.
Sous-expression | Allumettes |
---|---|
^ |
Il correspond au début de la ligne. |
$ |
Il correspond au début de la fin. |
[...] |
Il est utilisé pour correspondre à n’importe quel caractère unique présent dans le crochet. |
[^...] |
Il est utilisé pour correspondre à n’importe quel caractère unique non présent dans la parenthèse |
\\w |
Il est utilisé pour faire correspondre les caractères du mot. |
\\d |
Il est utilisé pour faire correspondre les chiffres. |
Conclusion
Dans cet article, nous avons découvert la classe Regex
présente dans la bibliothèque standard Scala. Nous avons également vu comment il fournit différentes API, qui nous aident à gérer les différents cas d’utilisation des expressions régulières
.