Accueil - Forum - Bibliothèque de ressources
____

Expressions régulières

1) Introduction

Les expressions régulières sont utilisés pour déterminer si une chaine de caractères se trouve ou correspond à une expression. Les expressions régulières sont aussi appelés Regexps ... qui viennent de la classe Regexps :) Prenons un exemple très simple pour expliquer les expressions régulières.

Code Rubyphrases = "Comme la neige en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide"
 puts phrases.grep(/neige/)

Nous avons ici une variable "phrases" qui est une chaine de caractères. Elle a deux phrases puisque "n" indique le passage à la ligne ... le saut de ligne. La méthode "grep" retourne la phrase qui a le mot "neige". Donc, ces lignes de codes vont afficher :

Comme la neige en ete et comme la pluie au temps de la moisson !

L'expression régulière est définie entre deux slashs (/). Nous verrons pas la suite, comment préciser des expressions. Avant cela, nous allons voir les méthodes. Ici, "grep" permet de faire ce traitement de chaines de caractères.

2) Les méthodes pour les expressions.
a) Remplacer : gsub

Code Rubyphrases = "Comme la neige en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide"
puts phrases.gsub(/neige/, "tempete")

La méthode "gsub" permet de remplacer l'expression par un mot. Ici, les mots "neige" sont remplacés par "tempete" dans les phrases :

Comme la tempete en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide

b) Scanner : scan

Code Rubyphrases = "Comme la neige en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide"
puts phrases.scan(/et/)

La méthode "scan" permet de scanner la chaine et de retourner dans un tableau les expressions. Ici, on aura comme résultat : [et, et]. Pourquoi deux fois "et" ? Parce qu'il prend l'expression "et" et non le mot :

"Comme la neige en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide"

c) Savoir la sous-chaine : [] ou slice

Code Rubyphrases = "Comme la neige en ete et comme la pluie au temps de la moisson ! n Ainsi la gloire ne convient pas a un homme stupide"
puts phrases[/Ainsi/]           # Affiche "Ainsi"
puts phrases.slice(/Ainsi/) # Affiche "Ainsi" aussi

"slice" ou les crochets permettent de savoir la sous chaine de la chaine. Ici, on veut le mot "Ainsi". Si on demande une sous chaine qui n'existe pas. La méthode renvoit "nil".

3) Les expressions régulières.

Une expression n'est pas seulement un mot entre deux slachs, sinon il y aurait peu d'utilité. Nous allons voir donc ce qu'on peut faire avec les expressions.

Code Rubyphrases = "Comme un oiseau s'enfuit et comme une hirondelle vole, et cela non sans causenAinsi une malediction n'arrive pas sans cause veritable."
 puts phrases.grep(/^Ainsi/) # Affiche la deuxième phrase
 puts phrases.grep(/^Comme/) # Affiche la première phrase
 puts phrases.grep(/cause$/) # Affiche la première phrase

Le ^ indique que le mot est en début de ligne, donc aussi après n.
Le $ indique que le mot est en fin de ligne, donc aussi avant n.

Code Rubymots = "oiseaunroseaunciseaunmanteaunAnneaun"
puts mots.grep(/[oic]seau/)             # Affiche "oiseau roseau ciseau"
puts mots.grep(/^[a-z]i/)               # Affiche "oiseau ciseau"
puts mots.grep(/^[aA-zZ]/)              # Affiche "oiseau roseau ciseau manteau Anneau"
puts mots.gsub(/[^n]/, "*")     # Affiche "****** ****** ****** ******* ******"
puts mots.gsub(/^[^a-m]/, "*")  # Affiche "*iseau *oseau ciseau manteau *nneau"

Ici, nous avons une liste de mots : oiseau, roseau, ciseau, manteau, Anneau.

Les crochets [] permettent de rechercher tout les caractères compris dedans. Ainsi "[oic]seau" va rechercher tous les mots qui ont "oseau", "iseau" ou "ceau"

De la même manière, "^[a-z]i" va rechercher tous les mots commençant (^) par une lettre minuscule entre a et z suivie de la lettre i donc tous les mots commençant par "ai", "bi", "ci", "di", "ei", "fi", "gi" etc...

"^[aA-zZ]" se comprote pareil que l'exemple ci-dessus. La seule particularité est qu'il prend en compte tout les mots commençant par les lettres minuscules ou majuscules.

Lorsque le "^" est entre les crochets et au début de ces derniers, il fait l'effet inverse. Ainsi, "[^n]" signifie : tous les caractères sauf "n". Sur cet exemple, vous remplacez tous les caractères sauf "n" par une étoile afin de préserver le saut de ligne.

Si vous avez tout compris, vous êtes donc capable de savoir ce que fait le cinquième exemple : "mots.gsub(/^[^a-m]/, "*")". Il signifie que tous les premiers caractères, de chaques mots, différents des lettres a à m sont remplacés par une étoile.

Code Rubyphrases = "Comme un oiseau s'enfuit et comme une hirondelle vole, et cela non sans causenAinsi une malediction n'arrive pas sans cause veritable."
 puts phrases.gsub(/.au/, "elle")
 puts phrases.gsub(/m+/, "l")
 puts phrases.gsub(/om*/, "l")
 puts phrases.gsub(/om?/, "l")

Le point "." signifie "n'importe quel caractère". C'est un peu comme le joker dans un jeu de carte qui remplace n'importe quelle carte :). Ainsi, les mots suivant :

- oiseau sera remplacé par oiselle (ici, "eau" de "oiseau" est remplacé par "elle")
- cause sera remplacé par ellese ("cau" de "cause" est remplacé par "elle"

Le + est la répétition d'une fois ou plusieurs fois. Ici, la lettre m sera changé par la lettre "l" mais "m+" peut être "mm" ou "mmm" ou bien "mmmmmmmmmm". Ainsi le "comme" de la phrase sera changé par "cole". Résultat :

Cole un oiseau s'enfuit et cole une hirondelle vole, et cela non sans cause Ainsi une lalediction n'arrive pas sans cause veritable.

Le * est la répétition de zéro fois ou plusieurs fois. C'est à dire ? Ici, "om*" correspond à "o" (sans la lettre "m" = zéro fois) ou à "om" ou bien à "ommm" ou alors "ommmmmmmmmmmmmm". Du coup, toutes les lettres "o" seront remplacés par "l" ... ainsi le "comme" de la phrase sera changé par "Cle". Résultat :

Cle un liseau s'enfuit et cle une hirlndelle vlle, et cela nln sans cause Ainsi une maledictiln n'arrive pas sans cause veritable.

Le ? est la répétion de zéro fois ou une fois. Ainsi pour ici, "om?" correspond seulement à "o" ou "om". Ainsi le "comme" de la phrase sera changé par "Clme". Résultat :

Clme un liseau s'enfuit et clme une hirlndelle vlle, et cela nln sans cause Ainsi une maledictiln n'arrive pas sans cause veritable.

Code Rubyphrases = "Je suis un robotnMy name is 56D34"
 puts phrases.grep(/y|r/)
 puts phrases.gsub(/d/, "*")
 puts phrases.gsub(/D/, "*")
 puts phrases.gsub(/w/, "*")

Le | est un "ou". Ruby prend la phrase ayant un y ou un r. Ici, il affiche les deux phrases.
Le d signifie à [0-9] soit tout les chiffres. Ici, il remplace "56D34" par "**D**"
Le D est le contraire de d. il faut donc faire attention aux majuscules qui ont une signification différente.
Le w est tout les chiffres et lettres. Ainsi toute la phrase sera modifiée. W est donc le contraire.

4) Exercice

Vous devez faire renter chaque mot d'une phrase ayant seulement des lettres miniscules, majuscules et sans accents dans un tableau.

Exemple :
Code Rubyphrase = "Liberez votre creativite"

Doit être : ["Liberez", "votre", "creativite"]

Réponse :

Pour retourner une chaine de caractères dans un tableau, il faut utiliser la méthode "scan" :

Code Rubyphrase.scan(/[aA-zZ]+/) # ou phrase.scan(/w+/)

Vous prenez tout les sous chaines ayant des plusieurs fois (+) des caractères de a à z et de A à Z ([aA-zZ])

Informations
Page vue 3719 fois | Auteur : Samarium

RPG Creative version 5 - Libérez votre créativité ! ; Mai 2005 - Mai 2012
0.077s - Optimisé pour une résolution 1024*728 - Tous droits réservés.

Contact - Partenaires - Historique - A propos