Travailler avec Regex dans Scala

Suraj P 16 février 2024
  1. Classe Regex dans Scala
  2. Trouver des correspondances dans le texte en Scala
  3. Utiliser Regex pour remplacer un texte dans Scala
  4. Utilisez Regex pour extraire des valeurs dans Scala
  5. Conclusion
Travailler avec Regex dans Scala

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)

Exécuter le code

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

Exécuter le code

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))

Exécuter le code

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

Exécuter le code

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

Exécuter le code

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

Exécuter le code

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

Exécuter le code

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.

Auteur: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub