Une expression régulière (abrégée regex ou regexp et parfois aussi appelée expression rationnelle) est une séquence de caractères qui forment un patron de recherche, principalement dans des fonctions de "pattern-matching" (recherche par correspondance de motif) et de "search-and-replace" (recherche et remplacement).
Les expressions régulières peuvent aussi jouer le rôle de générateur de données, en suivant le principe d’expression régulière renversée. Utilisées ainsi, elles fournissent des données aléatoires parfaitement adaptées à la réalisation des tests sur une base de données.
Utiliser les expressions régulières pour créer des données de test réalistes
Un des cas les plus courant est le numéro de téléphone. C’est d’ailleurs un très bon exemple de données que nous pouvons générer et insérer dans une base de données.
Intéressons-nous à la génération de numéros de téléphone aux Etats-Unis en utilisant des expressions régulières. Mais, avant d’aborder la construction de l’expression régulière que nous pouvons utiliser pour générer ces numéros, il est important de bien comprendre comment un tel numéro est construit. Ces numéros à 10 chiffres sont définis par le plan de numérotation nord-américain (North American Numbering Plan ou NANP). Le NANP est un système de numérotation téléphonique divisé en zones appelées "Numbering Plans Areas" ou NPA. Dans ce système, les numéros de téléphone peuvent être subdivisés en trois parties.
La première partie consiste en un ensemble de 3 chiffres correspondant à la zone. La deuxième correspond au préfixe de centrale (assignés à des opérateurs téléphoniques autorisés par les états). Cette deuxième partie est également composé de 3 chiffres. Enfin, la troisième et dernière partie est formée des 4 chiffres restants et correspond au numéro de station.
L’exemple ci-dessous correspond à la syntaxe d’un numéro de téléphone US:
### – ###- ####
code de zone – indicatif de central – identifiant de station
Il y a cependant quelques règles à respecter. Ainsi, seuls les chiffres de 2 à 9 peuvent être utilisés pour former le premier chiffre du code de zone et de l’indicatif de central alors que les chiffres de 0 à 9 peuvent être utilisés pour former l’identifiant de station.
Nous pouvons nous aider de ces règles pour construire une expression régulière qui nous permettra de générer des numéros aléatoires répondant au format des numéros de téléphone aux Etats-Unis. Pour ce faire, nous nous aiderons des éléments suivants:
Syntaxe |
Exemple |
Donnée(s) générée(s) |
. = correspond à n’importe quel caractère |
John |
John |
\ = Indique que le caractère qui suit est utilisé en tant que tel au lieu d’être interprété comme caractère spécial |
\.2 |
.2 |
() = Les opérateurs regroupés entre parenthèses sont groupés |
(Gr34T) |
Gr34T |
{n} = Générer n occurrences de l’élément qui précède |
ab{2} |
abb |
{n,m} = Génère au moins n et maximum m occurrences de l’élément qui précède |
Rd2{2,5} |
Rd22 or Rd2222 (par exemple) |
{n,} = Génère au moins n occurrences de l’élément qui précède |
T{3,} |
TTT or TTTT or TTTTT (par exemple) |
* = Génère 0 ou plusieurs répétitions de l’élément qui précède |
Rom3* |
Rom or Rom33 or Rom333 (par exemple) |
+ = Génère 1 ou plusieurs répétitions de l’élément qui précède |
Tun4+ |
Tun4 or Tun444 (par exemple) |
? = Génère 0 ou 1 répétition de l’élément qui précède |
Op3n? |
Op3 or Op3n |
| = Génère l’élément à gauche ou l’élément à droite du symbole |
True|False |
True ou False |
[] = Génère un des caractères se trouvant à l’intérieur des crochets |
[tRu3] |
t ou R ou u ou 3 |
[a-z] = génère un des caractères spécifié dans l’intervalle |
[0-9A-Z] |
U ou 5 ou Z (par exemple) |
[^abc] = génère n’importe quel caractère à l’exception de ceux listés entre les crochets |
[^0aT] |
Y ou 5 ou + (mais pas 0, ni a ni T)(par exemple) |
Vu que le premier chiffre des deux premières parties d’un numéro de téléphone aux Etats-Unis sont obligatoirement entre 2 et 9, nous utiliserons la syntaxe suivante: [2-9].
Vu qu’il n’y a pas de restriction sur les deux autres chiffres de ces parties, nous utiliserons la syntaxe suivante [0-9]{2} où [0-9] dénote tous les chiffres de 0 à 9 et {2} demande au générateur de générer deux occurrences aléatoires de chiffres entre 0 et 9.
Ainsi, si nous mettons les bouts ensembles, l’expression régulière [2-9][0-9]{2} permet de générer les trois chiffres nécessaires aux deux premières parties d’un numéro de téléphone. Cela donnera des résultats aléatoires comme 254, 634, 893, etc.
Passons à présent au caractère utilisé pour visuellement découper les groupes de nombres d’un numéro, à savoir le tiret (-). Ce caractère n’a pas de valeur syntaxique puisqu’il est juste visuel.
Comme les mêmes règles s’appliquent pour la formation des groupes “code de zone” et “indicatif de central”, nous allons utiliser la même expression régulière. L’expression régulière qui permet de générer les deux premières parties d’un numéro de téléphone au format utilisé aux Etats-Unis est: [2-9][0-9]{2}–[2-9][0-9]{2}. Elle produira des résultats comme par exemple : 367-245, 743-854, 423-522, etc.
Rappelons encore une fois que le tiret n’a aucune valeur syntaxique. C’est juste un caractère de séparation visuelle.
Nous arrivons enfin au dernier groupe de 4 chiffres correspondant à l’identifiant de la station. Pour créer l’expression régulière permettant de générer ce groupe de chiffres, nous utiliserons l’élément syntaxique [0-9] pour générer n’importe quel chiffre entre 0 et 9, et {4} pour notifier au générateur qu’il doit effectuer quatre fois cette génération. Les éléments syntaxiques mis à la suite forment l’expression régulière qui permet de générer des identifiants de station aléatoire, à savoir [0-9]{4}, dont voici quelques exemples de résultats possibles: 0245, 4392, 7402, etc.
Ainsi, nous avons revu chaque élément constituant l’expression régulière complète pour générer un numéro de téléphone. Celle-ci est la suivante:
[2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4},
Voici quelques exemples de numéros aléatoires générés en suivant cette expression régulière: 254-573-9330, 453-623-0521, 832-571-9562, etc.
Nous pouvons utiliser cette expression régulière dans les alternatives suivantes pour la génération de données aléatoires.
Des librairies pour générer des données dans différents langages de programmation
Si nous cherchons sur internet, nous trouverons rapidement qu’il existe un grand nombre de librairies disponibles pour plusieurs langages de programmation comme comme le PHP, le Java ou le C++ qui permettent de générer des données à partir d’une expression régulière. Par exemple, il y a xeger, une librairie écrite en java qui est spécialement destinée à la génération de chaînes de caractères sur base d’expression régulières. Nous allons dans la suite nous servir de l’expression régulière développée dans précédemment, à savoir:
String regex = "[2-9][0-9{2}-[2-9][0-9{2}-[0-9]{4}";
Voici les commandes faisant appel à la librairie xeger permettant d’y parvenir:
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
Et voici des exemples de données générées:
239-456-8845
345-542-5392
584-583-2940
879-220-3412
733-430-3290
…
Création d’un plan de génération de données dans Visual Studio 2010 en utilisant le générateur d’expression régulières (RegEx generator)
Nous pouvons également avoir recours aux fonctionnalités de génération de Visual Studio 2010 en utilisant le plan de génération de données (Data Generation Plan). Un plan de génération de données permet de définir la manière dont les données doivent être générées pour une table donnée et même pour une colonne donnée. Visual Studio 2010 fournit plusieurs méthodes de génération basées sur le type de données. Les propriétés de ces générateurs peuvent être changées pour définir des intervalles et des formats de données différents à générer.
Un de ces générateurs nous intéresse plus. Il s’agit du générateur d’expression régulière et peut être utilisé comme suit:
Start the Visual Studio 2010 and load your database project. Right click on the project node in the Solution Explorer, and go to the Add menu and click on the New item:
Démarrez Visual Studio 2010 et chargez un projet de base de données. Cliquez droit sur le noeud du projet de l’explorateur de solutions puis aller dans le menu Add (Ajouter) et cliquer sur New Item (nouvel élément).
Ceci ouvre une boite de dialogue intitulée Add New Item dans laquelle nous devons choisir le noeud Data Generation Plan (Planification de génération de données) sous le noeud Project (Projet). Sélectionnez dans la liste un canevas vide de Data Generation Plan (Planification de génération de données). Donnez un nom au plan de génération de données dans la zone de label Name (Nom) dans le bas de la boite de dialogue. Enfin, cliquez sur Add (Ajouter):
S’en suit alors un parcours des différents objets du schéma définis dans le projet de sorte que toutes les tables du projet se retrouvent listées dans l’assistant Data Generation Plan. Par défaut, toutes les tables font partie du plan de génération. Sélectionnez les tables pour lesquelles des données devraient être générées. Pour chaque table, saisissez le nombre de lignes devant être générées:
Next, select the Colum for which the Regular Expression (RegEx) generator will be used and in the Generator drop down menu select the Regular Expression generator. After the generator is set, the regular expression which will be used to generate random data should be entered. That is done in the properties window of the selected column, which is accessed by right clicking on the column and selecting the Properties item, or by pressing the F4 key. In the expression box enter the desired regular expression (in the example below the regular expression, explained in the beginning of the article, [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4} will generate random US telephone numbers):
Il faut encore sélectionner les colonnes pour lesquelles le générateur d’expression régulière doit être utilisé. Pour ce faire, il suffit de se rendre sur la colonne Generator et de faire apparaitre le menu déroulant pour sélectionner Regular Expression. Dès que c’est fait, nous devrions entrer l’expression régulière à utiliser en nous rendant dans la zone de propriétés dont F4 est le raccourci clavier. Dans la zone Expression, entrez l’expression régulière désirée (dans l’exemple ci-dessous, nous retrouverons celle présentée au début de cet article permettant de générer des numéros de téléphone conformes au format utilisé aux Etats-Unis, à savoir [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4}
Les données générées ressembleraient à ceci:
Nous pouvons avoir un aperçu des données qui vont être générées en cliquant droit sur l’écran de génération de données puis sur Preview Data Generation (Visualiser la génération des données). Cela ouvrira une fenêtre de visualisation dont vous aurez un aperçu ci-après:
Si la prévisualisation semble correcte, l’étape suivante consiste à générer les données. Pour ce faire, il nous suffit d’appuyer sur le bouton Generate Data (Générer des données) dans la barre d’outils ou en pressant la touche F5. Cela ouvrira l’assistant Connect to Database (Connexion à une base de données) où les détails de connexion à la base de données sont spécifiés:
Afin d’exécuter le plan de génération de données et générer les données pour les tables sélectionnées précédemment, les données de connexion doivent être spécifiées pour pouvoir cliquer sur le bouton OK.
Veuillez noter que l’option de génération de données a été dépréciée après Visual Studio 2010.
Génération de données aléatoires à partir d’une expression régulière avec ApexSQL Generate
ApexSQL Generate est un outil de génération de données, qui permet de générer rapidement des données depuis diverses sources en utilisant une variété de générateurs de données.
Une de ses fonctionnalités est de générer des données aléatoires sur base d’expressions régulières.
Le but est d’insérer une expression régulière qui sera utilisée pour remplir des colonnes avec des données de test. Nous pouvons utiliser la marche à suivre suivante:
-
Se connecter à la base de données en utilisant une connexion de base de données ou un alias de connexion
-
Dans la grille principale, sélectionner la table pour laquelle les données de test doivent être générées et, dans la zone Generation Options (options de génération), définir le nombre de lignes à générer:
-
Sélectionner les colonnes qui doivent être remplies avec des données:
-
Dans la liste du générateur, sélectionner Regular Expression:
-
Saisir l’expression régulière dans la zone de texte correspondante. Dès que c’est fait, le panneau de visualisation se met à jour et nous pouvons voir à quoi ressembleront les données. Pendant la saisie, les cent premières lignes du panneau de visualisation sont mises à jour automatiquement sur base de l’entrée courante. Dans l’exemple ci-dessous, nous avons entré l’expression régulière expliqué au début de cet article qui génère des numéros de téléphone, à savoir: [2-9][0-9]{2}-[2-9][0-9]{2}-[0-9]{4}:
L’option Unique assure que les valeurs générées sont uniques.
La chose importante à noter est que l’ensemble des valeurs générées est défini par la valeur de l’option Seed. En effet, à une valeur donnée de l’option Seed correspond un et un seul ensemble de données générées. Par exemple, si l’expression régulière décrite dans cet article est utilisée avec une valeur de 0 pour l’option Seed, les premières lignes générées seraient:
Si nous changeons cette valeur pour 53, la génération donnerait:
L’ensemble généré peut être reproduit en utilisant la même expression régulière et la même valeur pour l’option Seed. Ceci peut être utilisé lorsque les données de plusieurs colonnes doivent être remplies avec les mêmes données dans le même ordre
Vous trouverez plus d’information sur la valeur de l’option “Seed” dans l’article de la base de connaissanc “Seed feature in ApexSQL Generate”.
Une fois que toutes les options sont définies, le processus de génération de données peut être lancé en appuyant sur le bouton Generate (Générer) de l’écran principal.
August 25, 2017