Page 1 sur 1

Ma fonction Expression régulière ne fonctionne pas

Publié : ven. 17/févr./2023 8:50
par hub73
Bonjour à vous.
Je ne vois pas mon erreur sur cette fonction.
[a-zA-Z0-9_] : Caractères minuscules et majuscules, chiffre de 0 à 9 et le caractère souligné du 6 autorisés.
Prenom$ = "hubert!?"
devrait me retourner le message d'erreur mais non.
Merci de votre aide.

Code : Tout sélectionner

Procedure.l Verifier_expression_reguliere_correcte (ExpressionReguliere$, Source$)
  
  Protected Resultat
  
  Protected Id
  
  Id = CreateRegularExpression(#PB_Any, ExpressionReguliere$)
  If Id <> 0  
    If MatchRegularExpression(Id, Source$) >= 1
      Resultat = #True
      Debug "Vrai"
    Else
      Resultat = #False
      Debug "Faux"
    EndIf
    FreeRegularExpression (Id)
  Else
    MessageRequester ("Erreur !", "Erreur de formulation de contrôle d'expression régulière : " + RegularExpressionError())
  EndIf
  
  ProcedureReturn Resultat
      
EndProcedure

Prenom$ = "hubert!?"

If Verifier_expression_reguliere_correcte ("[a-zA-Z0-9_]", Prenom$) = #False
  MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 

Re: Ma fonction Expression régulière ne fonctionne pas

Publié : ven. 17/févr./2023 11:08
par Marc56
Ton expression signifiait "au moins une des lettres" (donc tout y passe)
Rapidement, ceci fonctionne (il existe des tas de façons de faire)

Code : Tout sélectionner

"[a-zA-Z0-9_]+[ \r\n]"
= Plusieurs des caractères suivi d'un espace ou d'un saut de ligne
ou même \w+[ \r\n]

Re: Ma fonction Expression régulière ne fonctionne pas

Publié : ven. 17/févr./2023 11:09
par Mesa
Il vaut mieux rechercher les caractères interdits.

Code : Tout sélectionner

Procedure.l Verifier_expression_reguliere_correcte (ExpressionReguliere$, Source$)
	
	Protected Resultat
	
	Protected Id
	
	Id = CreateRegularExpression(#PB_Any, ExpressionReguliere$)
	If Id <> 0  
		If MatchRegularExpression(Id, Source$) >= 1
			Resultat = #False
			Debug "Le prénom contient des caratères interdits"
		Else
			Resultat = #True
			Debug "Ok"
		EndIf
		FreeRegularExpression (Id)
	Else
		MessageRequester ("Erreur !", "Erreur de formulation de contrôle d'expression régulière : " + RegularExpressionError())
	EndIf
	
	ProcedureReturn Resultat
	
EndProcedure

Prenom$ = "hubert!?"

If Verifier_expression_reguliere_correcte ("[^a-zA-Z0-9_]", Prenom$) = #False
	MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 

Prenom$ = "hubert_"

If Verifier_expression_reguliere_correcte ("[^a-zA-Z0-9_]", Prenom$) = #False
	MessageRequester ("Erreur", "Le prénom doit être composé de lettres, chiffres et le caractère tiret du 6 _ uniquement ! ", #PB_MessageRequester_Error)
EndIf 
M.

Re: Ma fonction Expression régulière ne fonctionne pas

Publié : ven. 17/févr./2023 11:18
par Marc56
Oui, exactement :D

Re: Ma fonction Expression régulière ne fonctionne pas

Publié : ven. 17/févr./2023 11:49
par hub73
Super. Merci à tous les deux.

Re: Ma fonction Expression régulière ne fonctionne pas

Publié : lun. 17/juil./2023 20:00
par boddhi
Pour le fun et à toutes fins utiles,

Une variante possible :

Code : Tout sélectionner

^(?i)[\da-z-]+$

^ : Qui doit commencer impérativement par la séquence qui suit
(?i) : Insensibilité à la casse pour ce qui suit
[ : Tout caractère autorisé par la contrainte définie jusqu'à ]
\d : Tout chiffre
a-z (ou A-Z) : Toute lettre non accentuée de a à z (ou A à Z puisqu'insensible à la casse)
- : Signe moins
+ : Une ou plusieurs itérations du caractère contraint précédemment
$ : Qui doit se terminer impérativement par la contrainte précédente

La même mais avec l'obligation d'avoir une lettre majuscule pour initiale (imposée par le segment [A-Z]) :

Code : Tout sélectionner

^[A-Z](?i)[\da-z-]+$
Note : Pour gérer les lettres accentuées qui ne sont pas permises dans ces deux exemples, il convient d'ajouter entre les [] celles que l'on souhaite autoriser.