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. PhilippeSystè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. PhilippeSystè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 '\'
OlivierLorsqu'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é. PhilippeSystè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 '\'
OlivierLorsqu'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
|