Gambas France BETA


Pas de compte ? Incription

Les expressions régulières

Ce sujet est résolu.

1
AuteurMessages
valaquarus#1 Posté le 15/6/2022 à 10:00:03
-- Unus Ex Altera --Bonjour à tous,
je ne maîtrise pas du tout le sujet c'est pourquoi je vous demande si quelqu'un a un exemple simple d'utilisation avec des explications tout aussi simples que je pourrai intégrer dans le wiki.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
Patrick#2 Posté le 15/6/2022 à 17:00:04
Bonjour,
Les exemples ci-dessous servent à contrôler une saisie en temps réel :
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
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 ,
PUBLIC CONST chaine AS STRING = "[^%^_]*" 'saisie d'une chaîne en excluant les caractères spéciaux de recherche BD (a compléter et vérifier)
PUBLIC CONST mail AS STRING = "[a-zA-Z0-9_.+-]+@?[a-zA-Z0-9.-]*" 'saisie d'une adresse mail peut certainement s'améliorer
PUBLIC CONST dts AS STRING = "[0-9]{0,2}[./-]?[0-9]{0,2}[./-]?[0-9]{0,4}" 'Date
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 + time

PUBLIC SUB _new()

$reg = chaine
$regex.Compile($reg) 'Je pré compile ma constante chaine, ce sera plus rapide

END

PUBLIC SUB butb_change()

IF IsNull(ME.Editor.Text) THEN
$text = ""
$value = 0
RETURN
ENDIF
TRY $regex.Exec(ME.Editor.Text) 'A chaque entrée on test la chaîne de caractère
IF ERROR THEN
ME.Editor.Text = $text 'Si erreur on revient à la chaîne précédente
RETURN
ENDIF
END


Il y a plein de tuto sur internet qui expliquent leurs fonctionnements (https://www.lucaswillems.com/fr/articles/25/tutoriel-pour-maitriser-les-expressions-regulieres)

Ci-dessous la transformation de requêtes mysql en sqlitle3 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
'la concatenation à 2 arguments => est il possible de faire + ?
IF UCase(Request) MATCH "CONCAT" THEN
Request = regex.Replace(Request, "CONCAT\\(([()'. a-zA-Z0-9_éèàêâù%-]+) *, *([()'. a-zA-Z0-9_éèàêâù%-]+)\\)"", regex.Caseless)
ENDIF
'les chaines
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)
'null
IF UCase(Request) MATCH "ISNULL" THEN request = regex.Replace(Request, "isnull\\(([()' .a-zA-Z0-9_-]+)\\)", "&1 IS NULL", regex.Caseless)

valaquarus#3 Posté le 15/6/2022 à 17:13:17
-- Unus Ex Altera --Merci Patrick,
pour cette moisson que je vais de ce pas décortiquer.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#4 Posté le 15/6/2022 à 19:07:28
-- Unus Ex Altera --Bonsoir Patrick,
j'ai besoin d'explications.
pourquoi utilises tu une procédure regex à la place de regExp ?
pourquoi n'y a t il pas de balise de début ^ et de balise de fin d'expression $ ?
Dans ton premier exemple RegExp.compile ne veut pas se faire, j'ai comme erreur : RegExp.Compile n'est pas statique.
J'ai modifié ton exemple ainsi :
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
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 ,
PUBLIC CONST chaine AS STRING = "[^%^_]*" 'saisie d'une chaîne en excluant les caractères spéciaux de recherche BD (a compléter et vérifier)
PUBLIC CONST mail AS STRING = "[a-zA-Z0-9_.+-]+@?[a-zA-Z0-9.-]*" 'saisie d'une adresse mail peut certainement s'améliorer
PUBLIC CONST dts AS STRING = "[0-9]{0,2}[./-]?[0-9]{0,2}[./-]?[0-9]{0,4}" 'Date
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 + time
PUBLIC $reg AS STRING

PUBLIC SUB _new()

$reg = chaine
' RegExp.Compile($reg) 'Je pré compile ma constante chaine, ce sera plus rapide

END

PUBLIC SUB butb_Change()

IF IsNull(butb.Editor.Text) THEN
butb.text = ""
butb.value = 0
RETURN
ENDIF
TRY RegExp.Exec(ME.Editor.Text) 'A chaque entrée on test la chaîne de caractère
IF ERROR THEN
butb.Editor.Text = butb.text 'Si erreur on revient à la chaîne précédente
RETURN
ENDIF

END
)
Car je ne savais pas ce qu'était butb (peut être un buttonbox) mais butb.value n'existe pas?
Dis moi si cela correspond bien à ce que tu voulais montrer?
Que manque t il comme définition pour faire fonctionner ton exemple correctement dans gambas pas dans PHP.

Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
linuxos#5 Posté le 15/6/2022 à 21:00:10
Un peu de sel, de poivre et la crevette sera... Bonjour,

En plus des exemples, que l'on peut trouver sur internet, ce qui m'a vraiment aidé et qui m'aide encore, c'est le site https://regex101.com/
qui permet de vraiment valider si une expression PCRE donne le résultat escompté.

Si l'expression régulière est correcte, alors 80% du travail est déja bon.

Nota: il faut 'échapper' certains caractères d'une expression du site 'regex101.com' pour l'utiliser dans Gambas, surtout les caratères '\'

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
valaquarus#6 Posté le 15/6/2022 à 22:15:18
-- Unus Ex Altera --Merci Olivier,
pour ce super lien.
Absolument indispensable, pour novice comme pour confirmé.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
linuxos#7 Posté le 16/6/2022 à 02:06:26
Un peu de sel, de poivre et la crevette sera... Bonjour,

En plus des exemples, que l'on peut trouver sur internet, ce qui m'a vraiment aidé et qui m'aide encore, c'est le site https://regex101.com/
qui permet de vraiment valider si une expression PCRE donne le résultat escompté.

Si l'expression régulière est correcte, alors 80% du travail est déja bon.

Nota: il faut 'échapper' certains caractères d'une expression du site 'regex101.com' pour l'utiliser dans Gambas, surtout les caratères '\'

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Patrick#8 Posté le 16/6/2022 à 06:01:38
Bonjour,
C'est une variable :
1
PRIVATE $regex AS NEW RegExp

C'est un objet qui hérite d'un ButtonBox, "butb" sert à récupérer les événements.
1
obs = NEW Observer(ME) AS "butb"

Le code complet se trouve ici :
https://github.com/PatrickMag/Laurux/blob/mergepat_ttc/.src/Utils/TextReg.class
1