English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expression régulière Scala

Scala utilise le paquet scala.util.matching pour Regex La classe pour prendre en charge les expressions régulières. L'exemple suivant montre comment utiliser les expressions régulières pour rechercher des mots. Scala :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala est Scalable et cool"
      
      println(pattern findFirstIn str)
   }
}

Exécuter le code suivant, le résultat est :

$ scalac Test.scala 
$ scala Test
Some(Scala)

Dans l'exemple, un objet Regex est construit à l'aide de la méthode r() de la classe String.

Ensuite, utilisez la méthode findFirstIn pour trouver le premier élément correspondant.

Si vous devez afficher tous les éléments correspondants, vous pouvez utiliser la méthode findAllIn.

Vous pouvez utiliser la méthode mkString( ) pour connecter les chaînes de résultats de correspondance régulière et utiliser le管道(|) pour définir différents modèles :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // La première lettre peut être en majuscule S ou en minuscule s
      val str = "Scala est scalable et cool"
      
      println((pattern findAllIn str).mkString(","))   // Connecter les résultats de retour en utilisant une virgule ,
   }
}

Exécuter le code suivant, le résultat est :

$ scalac Test.scala 
$ scala Test
Scala,scala

Si vous devez remplacer le texte correspondant par un mot clé spécifié, vous pouvez utiliser replaceFirstIn( ) Méthode pour remplacer le premier élément correspondant, en utilisant replaceAllIn( ) Méthode pour remplacer tous les éléments correspondants, exemple suivant :

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala est scalable et cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Exécuter le code suivant, le résultat est :

$ scalac Test.scala 
$ scala Test
Java est scalable et cool

Expression régulière

Les expressions régulières Scala héritent des règles de syntaxe de Java, et Java utilise la plupart des règles du langage Perl.

Dans le tableau suivant, nous avons donné quelques règles d'expressions régulières couramment utilisées :

ExpressionRègle de correspondance
^ Correspond à la position de début de la chaîne d'entrée.
$Correspond à la position de fin de la chaîne d'entrée.
.Correspond à tout caractère sauf "\r\n"
[...]Ensemble de caractères. Correspond à l'un des caractères inclus. Par exemple, "[abc]" correspond à "plain" dans "a".
[^...]Caractère de négation. Correspond à tout caractère non inclus. Par exemple, "[^abc]" correspond à "plain" dans "p", "l", "i", "n".
\\ACorrespond à la position de début de la chaîne de caractères (sans support pour les lignes multiples)
\\zFin de la chaîne de caractères (similaire à $, mais n'est pas affecté par l'option de traitement des lignes multiples)
\\ZFin de la chaîne de caractères ou de la fin de la ligne (n'est pas affecté par l'option de traitement des lignes multiples)
re*Répète zéro fois ou plus
re+Répète une fois ou plus
re?Répète zéro fois ou une fois
re{ n}Répète n fois
re{ n,}Répète n fois ou plus
re{ n, m}Répète n à m fois
a|bCorrespond à a ou b
(re)Correspond à re, et capture le texte dans un groupe automatiquement nommé
(?: re)Correspond à re, sans capturer le texte correspondant, ni attribuer un numéro de groupe à ce groupe
(?> re)Expression régulière gourmande
\\wCorrespond à une lettre ou un chiffre ou un tiret bas ou un caractère chinois
\\W]}Correspond à tout caractère autre qu'une lettre, un chiffre, un tiret bas, un caractère chinois
\\sCorrespond à tout espace, équivalent à [\t\n\r\f]
\\SCorrespond à tout caractère autre qu'un espace
\\dCorrespond à des chiffres, semblable à [0-9]
\\DCorrespond à tout caractère non numérique
\\GDébut de la recherche actuelle
\\nRetour chariot
\\bGénéralement une position de délimitation de mot, mais si elle est utilisée dans un ensemble de caractères, elle représente un retour arrière
\\BCorrespond à des positions qui ne sont pas le début ni la fin d'un mot
\\tTabulation
\\QDébut des guillemets :\Q(a+b)*3\E Correspond au texte "(a+b)*3"。
\\EFin des guillemets :\Q(a+b)*3\E Correspond au texte "(a+b)*3"。

Exemple d'expression régulière

ExempleDescription
.Correspond à tout caractère sauf "\r\n"
[Rr]ubyCorrespond à "Ruby" ou "ruby"
rub[ye]Correspond à "ruby" ou "rube"
[aeiou]Correspond aux lettres minuscules :aeiou
[0-9]Correspond à tout chiffre, semblable à [0123456789]
[a-z]Correspond à toute lettre minuscule ASCII
[A-Z]Correspond à toute lettre majuscule ASCII
[a-zA-Z0-9]Correspond à des chiffres et des lettres majuscules et minuscules
[^aeiou]Correspond à des caractères autres que aeiou
[^0-9]Correspond à des caractères autres que des chiffres
\\dCorrespond à des chiffres, semblable à: [0-9]
\\DCorrespond à des caractères non numériques, semblable à: [^0-9]
\\sCorrespond aux espaces, semblable à: [ \t\r\n\f]
\\SCorrespond à des caractères non espaces, semblable à: [^ \t\r\n\f]
\\wCorrespond à des lettres, des chiffres, des tirets bas, semblable à: [A-Za-z0-9_]
\\W]}Correspond à ce qui n'est pas un alphabet, un chiffre, un tiret bas, etc. : [^A-Za-z0-9_]
ruby?Correspond à "rub" ou "ruby" : y est optionnel
ruby*Correspond à "rub" ajouté 0 de y ou plusieurs.
ruby+Correspond à "rub" ajouté 1 de y ou plusieurs.
\\d{3}Correspond exactement à 3 de nombres.
\\d{3,}Correspond à 3 de nombres ou plusieurs.
\\d{3,5}Correspond à 3 et4 ou 5 de nombres.
\\D\\d+Pas de groupe : + Répétition de \d
(\\D\\d)+/Groupe : + Répétition de \D\d
([Rr]uby(, )?)+Correspond à "Ruby", "Ruby, ruby, ruby", etc.

Attention, chaque caractère de la table ci-dessus est utilisé deux fois. C'est parce que dans Java et Scala, les backslashes dans les chaînes de caractères sont des caractères d'échappement. Donc si vous voulez afficher \, vous devez écrire \\ dans la chaîne pour obtenir un backslash. Voir l'exemple suivant :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 et cool
      
      println((pattern findAllIn str).mkString(","))
   }
}

Exécuter le code suivant, le résultat est :

$ scalac Test.scala 
$ scala Test
able1