Gambas France BETA


Pas de compte ? Incription

Exemple 16 :

Les Expressions Régulières :



La première des choses, pour pouvoir les utiliser dans un projet, est d'intégrer le composant : gb.pcre.



Vous pouvez télécharger un petit test ici : Les Expressions Régulières ou bien celui-ci : Aide à la Manipulation des Expressions Régulières

Premier exemple, Contrôler la validité d'une adresse mail :



Dans un bouton_click quelconque de validation :
1
2
3
4
5
6
7
8
IF NOT RegExp.Match(tbEmail.Text, "^[A-Z0-9._%+-]+@[A-Z0-9._%-]{2,}+.[A-Z]{2,63}$") THEN
Message.Info(("Remplissez correctement le champs eMail"))
tbEmail.Text = ""
tbEmail.SetFocus
STOP EVENT
ELSE
message ("Adresse Mail Valide !")
ENDIF


Explications :






Attention, une adresse mail valide veut simplement dire qu'elle est bien construite selon les normes en vigueur, pas qu'elle existe vraiment.








Deuxième exemple, beaucoup plus sophistiqué, pour contrôler une saisie en temps réel :


Proposé par Patrick :

Dans un formulaire, on crée un ButtonBox (butb), dans la procédure ListView1_Select() on choisit sa constante à tester parmi celles proposées.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
' Gambas class file

PUBLIC CONST all AS STRING = "^.*$" 'tout est autorisé
PUBLIC CONST path AS STRING = "^[a-zA-Z0-9_.+-@:&/]*$" 'saisie d'un chemin
PUBLIC CONST url AS STRING = "^[a-zA-Z0-9_.+-@:&!*'();:@=+$,/?#\\[\\]%]*$" 'saisie d'une url ... a revoir
PUBLIC CONST code AS STRING = "^[a-zA-Z0-9]*$" 'saisie d'un code tel que supporté par Laurux
PUBLIC CONST compte AS STRING = "^[0-9]*$" 'saisie d'un compte à la main
PUBLIC CONST num AS STRING = "^-?[0-9]*[,.]?[0-9]*$" 'saisie d'un numérique avec virgule ou point décimal
PUBLIC CONST numVirgul2 AS STRING = "^-?[0-9]*[,.]?[0-9]{0,2}$" 'valeur numérique avec deux décimales
PUBLIC CONST numVirgul3 AS STRING = "^-?[0-9]*[,.]?[0-9]{0,3}$" 'valeur numérique avec deux décimales
PUBLIC CONST chaine AS STRING = "^[^ % ^_]*$" 'saisie d'une chaîne en excluant les caractères spéciaux de recherche BD
PUBLIC CONST courriel AS STRING = "^[A-Z0-9._%+-]+@[A-Z0-9._%-]+.[A-Z]{2,63}$" 'saisie d'une adresse courriel
PUBLIC CONST dts AS STRING = "^[0-9]{0,2}[./-]?[0-9]{0,2}[./-]?[0-9]{0,4}$" 'Date sans le temps
PUBLIC CONST dtst AS STRING = "^[0-9]{0,2}[./-]?[0-9]{0,2}[./-]?[0-9]{0,4}[ ]?[0-9]{0,2}[:]?[0-9]{0,2}$" 'Date avec le temps
PUBLIC CONST tel AS STRING = "^(0|'\'+33)[1-9]( *[0-9]{2}){4}$" 'numéro de Tél français (changer le code international, ici 33)
PUBLIC CONST https AS STRING = "^https?://[a-zA-Z0-9'\'.-]+'\'.[a-zA-Z]{2,4}(/'\'S*)?$" 'adresse internet

PUBLIC Liste AS NEW String[]
PUBLIC ListeB AS NEW String[]

PUBLIC $reg AS STRING
PUBLIC $text AS STRING

PUBLIC $value AS FLOAT

PUBLIC $regex AS NEW RegExp

PUBLIC SUB _new()

DIM sCste AS STRING
DIM i AS INTEGER

'si vous ajoutez une constante ajoutez la, à Liste et votre commentaire, à ListeB. À LA MÊME POSITION.

Liste = [all, path, url, code, compte, num, numVirgul2, numVirgul3, chaine, courriel, dts, dtst, tel, https]
ListeB = ["Tout est possible", "Chemin de Dossier", "URL", "Code", "Valeur de Compte", "Valeur Numérique"
"Valeur Numérique à deux décimales" "Valeur Numérique à trois décimales", "Chaîne de Recherche dans Base de Données",
"Adresse courriel", "Date sans le Temps", "Date avec le Temps", "Numéro de téléphone (France)"
, "Lien internet https"]

i = 0
FOR EACH sCste IN Liste
ListView1.Add(CStr(i), sCste)
INC i
NEXT

END

PUBLIC SUB ListView1_Select()

$reg = ListView1.Current.Text
$Regex.Compile($reg, $regex.Caseless)
TextBox1.Text = $reg
TextBox2.Text = ListeB[CInt(ListView1.Key)] & ", cle = " & ListView1.Key

END


Une image :






Dans le petit test : Les Expressions Régulières je vous propose de rajouter des expressions régulières de votre cru, comme vos propres constantes. Elles apparaîtront, alors dans le listView. Les expressions sont testées à posteriori quand on valide le texte avec la touche entrée.

Troisième exemple, toujours plus sophistiqué, pour assurer la transformation de requêtes mysql en sqlitle3 :


Proposé par Patrick :

1
2
3
4
5
6
7
8
9
10
11
12
PUBLIC regex AS NEW RegExp
PUBLIC Request AS STRING

IF UCase(Request) MATCH "YEAR" THEN Request = regex.Replace(Request, "YEAR *\\(([()'. a-zA-Z0-9_-]+)\\)", "strftime('%Y',&1) ", regex.Caseless)
IF UCase(Request) MATCH "MONTH" THEN Request = regex.Replace(Request, "MONTH *\\(([()'. a-zA-Z0-9_-]+)\\)", "strftime('%m',&1) ", regex.Caseless)
IF UCase(Request) MATCH "DAY" THEN Request = regex.Replace(Request, "DAY *\\(([()'. a-zA-Z0-9_-]+)\\)", "strftime('%d',&1) ", regex.Caseless)
IF UCase(Request) MATCH "NOW" THEN Request = regex.Replace(Request, "NOW *\\(\\)", "strftime('%Y-%m-%d','now') ", regex.Caseless)
IF UCase(Request) MATCH "CONCAT" THEN Request = regex.Replace(Request, "CONCAT\\(([()'. a-zA-Z0-9_éèàêâù%-]+ )*,* ([()'. a-zA-Z0-9_éèàêâù%-]+)\\)"egex.Caseless)
IF UCase(request) MATCH "LEFT" THEN Request = regex.Replace(Request, "left\\(([().' a-zA-Z0-9_-]+) *, *([0-9-]+)\\)", "substr(&1,0,&2) ", regex.Caseless)
IF UCase(request) MATCH "RIGHT" THEN Request = regex.Replace(Request, "right\\(([()'. a-zA-Z0-9_-]+) *, *([0-9-]+)\\)", "substr(&1,-&2) ", regex.Caseless)
IF UCase(request) MATCH "MID" THEN Request = regex.Replace(Request, "mid\\(([().' a-zA-Z0-9_-]+) *, *([0-9-]+) *, *([0-9-]+)\\)", "substr(&1,&2,&3) ", regex.Caseless)
IF UCase(Request) MATCH "ISNULL" THEN request = regex.Replace(Request, "isnull\\(([()' .a-zA-Z0-9_-]+)\\)", "&1 IS NULL", regex.Caseless)


Je vous laisse le soin de construire ce qu'il faut pour tester ces possibilités sinon essayer les, directement sur le site : regex101.com (aller à la page des Settings pour régler la langue).

====================

Liens vers les commandes utilisées :




====================

Navigation :



<-- Liens du Wiki : <--
<-- Accueil du WIKI : <--

====================

Documentation :



====================